The virtual keyword is used in different ways in C++.
The most common way to use it is before a destructor.
Indeed, with this virtual keyword we can specified that the children of a class will be deleted before its parent.
Let's see it with a tutorial.
In this example, I created two classes, a Parent and a Child. So Child inherits from Parent.
The headers:
// parent.hh class Parent { public: Parent(); ~Parent(); }; // child.hh class Child: public Parent { public: Child(); ~Child(); };
Then the sources:
// parent.cpp #include "parent.hh" #include <iostream> Parent::Parent() { std::cout << "Parent created." << std::endl; } Parent::~Parent() { std::cout << "Parent deleted." << std::endl; } // child.cpp #include "child.hh" #include <iostream> Child::Child() { std::cout << "Child created." << std::endl; } Child::~Child() { std::cout << "Child deleted." << std::endl; }
And the main.cpp:
#include "parent.hh" #include "child.hh" int main() { Parent *human = new Child; delete human; return 0; }
Now let's compile it and see the famous result:
Parent created. Child created. Parent deleted.
And this case, the child instance can not be deleted anymore!
How to resolve this problem?
With the virtual keyword of course!
I just add virtual before each destructor in the respective classes.
The sources stay the same:
// parent.hh class Parent { public: Parent(); virtual ~Parent(); }; // child.hh class Child: public Parent { public: Child(); virtual ~Child(); };
Let's compile:
Parent created. Child created. Child deleted. Parent deleted.
Now the child is deleted.
The virtual keyword transform a function into a method.
This is important, because a function is interpreted during the compilation and a method during the execution.
We can also notice that if we test this example with:
Child *human = new Child;
instead of
Parent *human = new Child;
we will be able to delete the child without the virtual keyword.
Add new comment