When overriding a class in C++ (with a virtual destructor) I am implementing the destructor again as virtual on the inheriting class, but do I need to call the base destructor?
If so I imagine it's something like this...
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Am I right?
No. It's automatically called.
No, destructors are called automatically in the reverse order of construction. (Base classes last). Do not call base class destructors.
What the others said, but also note that you do not have to declare the destructor virtual in the derived class. Once you declare a destructor virtual, as you do in the base class, all derived destructors will be virtual whether you declare them so or not. In other words:
No. Unlike other virtual methods, where you would explicitly call the Base method from the Derived to 'chain' the call, the compiler generates code to call the destructors in the reverse order in which their constructors were called.
No, you never call the bese class destructor, it is always called automatically like others have pointed out but here is proof of concept with results:
The output is:
If you set the base class destructor as virtual which one should, then case 3 results would be same as case 1 & 2.
No you don't need to call the base destructor, a base destructor is always called for you by the derived destructor. Please see my related answer here for order of destruction.
To understand why you want a virtual destructor in the base class, please see the code below:
When you do:
Then if you did not have a virtual destructor in B, only ~B() would be called. But since you have a virtual destructor, first ~D() will be called, then ~B().