What if your program could force every part to do its job perfectly, every time?
Why Pure virtual functions in C++? - Purpose & Use Cases
Imagine you are building a program with different types of animals, each making a unique sound. You try to write separate functions for each animal's sound manually, but you want a way to ensure every animal class has its own sound function.
Manually checking if every animal class has a sound function is slow and error-prone. You might forget to add the function in some classes, causing bugs or inconsistent behavior. It's like having a checklist but no way to enforce it automatically.
Pure virtual functions let you define a function that must be implemented by every subclass. This means the compiler forces you to provide the specific behavior for each animal, ensuring consistency and preventing mistakes.
class Animal { public: void sound() { /* maybe empty or default */ } };
class Animal { public: virtual void sound() = 0; };
It enables creating a clear contract for subclasses, guaranteeing they implement essential behaviors while allowing flexible and safe design.
In a drawing app, you have a base Shape class with a pure virtual draw() function. Every shape like Circle or Rectangle must implement draw(), so the app knows how to display each shape correctly.
Pure virtual functions enforce that subclasses implement specific functions.
They prevent incomplete or inconsistent class designs.
They help create flexible and reliable code structures.
Practice
pure virtual function in C++?Solution
Step 1: Understand pure virtual function role
A pure virtual function is declared with= 0and has no body in the base class.Step 2: Effect on derived classes
Derived classes must provide their own implementation of this function, or they become abstract too.Final Answer:
To force derived classes to implement the function -> Option AQuick Check:
Pure virtual function = forces implementation [OK]
- Thinking pure virtual allows base class objects
- Assuming pure virtual provides default code
- Confusing pure virtual with private functions
draw in a class?Solution
Step 1: Recall pure virtual function syntax
Pure virtual functions use the keywordvirtualand end with= 0;.Step 2: Check each option
virtual void draw() = 0; matches the correct syntax:virtual void draw() = 0;. Others have wrong order, missing virtual, or provide a body.Final Answer:
virtual void draw() = 0; -> Option BQuick Check:
Syntax = virtual + = 0 [OK]
- Placing 'virtual' after return type incorrectly
- Adding function body {} for pure virtual
- Omitting 'virtual' keyword
#include <iostream>
class Shape {
public:
virtual void draw() = 0;
};
class Circle : public Shape {
public:
void draw() { std::cout << "Circle drawn" << std::endl; }
};
int main() {
Circle c;
c.draw();
return 0;
}Solution
Step 1: Analyze class Shape
Shape has a pure virtual functiondraw(), so Shape is abstract and cannot be instantiated.Step 2: Analyze class Circle
Circle overridesdraw()with its own implementation, so Circle is concrete and can be instantiated.Step 3: Check main function
Circle objectcis created andc.draw()prints "Circle drawn".Final Answer:
Circle drawn -> Option CQuick Check:
Derived class implements pure virtual = prints output [OK]
- Trying to instantiate abstract base class
- Forgetting to override pure virtual function
- Expecting no output due to pure virtual
class Animal {
public:
virtual void sound() = 0;
};
class Dog : public Animal {
};
int main() {
Dog d;
d.sound();
return 0;
}Solution
Step 1: Check pure virtual function in Animal
Animal declaressound()as pure virtual, so Animal is abstract.Step 2: Check Dog class implementation
Dog inherits Animal but does not implementsound(), so Dog remains abstract and cannot be instantiated.Step 3: Analyze main function
Trying to create Dog objectdcauses compilation error because Dog is abstract.Final Answer:
Dog class does not implement pure virtual function sound() -> Option DQuick Check:
Abstract class must implement all pure virtual functions [OK]
- Assuming base class cannot have pure virtual functions
- Thinking missing main causes error here
- Believing code runs without overriding pure virtual
#include <iostream>
class Base {
public:
virtual void f() = 0;
virtual void g() { std::cout << "Base g" << std::endl; }
};
class Derived : public Base {
public:
void f() override { std::cout << "Derived f" << std::endl; }
void g() override { std::cout << "Derived g" << std::endl; }
};
int main() {
Base* b = new Derived();
b->f();
b->g();
delete b;
return 0;
}Solution
Step 1: Understand Base class
Base has pure virtualf()and virtualg()with implementation.Step 2: Analyze Derived class
Derived overrides bothf()andg()with its own implementations.Step 3: Check main function calls
Pointerbof type Base* points to Derived object. Virtual calls invoke Derived versions off()andg().Final Answer:
Output is: Derived f Derived g -> Option AQuick Check:
Virtual functions call derived overrides [OK]
- Expecting base class methods to run
- Thinking pure virtual causes compile error here
- Confusing pure virtual with runtime error
Ready to prove it?
Pass the test and this pattern moves unknown
