need to call the base destructor method from a derived class in c++?

Heisenbug picture Heisenbug · Apr 5, 2011 · Viewed 19.6k times · Source

please consider the following

class base{
    base();
    ~base();
}:

class derived : public base{

};

Does a base class destructor is automatically invoked when a derived object is destructed and the derived class has no destructor defined?

Otherwise, if I have a destructor in the derived class too, do I need to call explicitly base class destructor too?

class base{
    base();
    ~base();
}:

class derived : public base{
     derived();
     ~derived
           base::~base(); //do I need this?
     }
};

Answer

Jon picture Jon · Apr 5, 2011

The base class destructor is automatically invoked in this case; you do not need to call it.

However, note that when destroying an object through delete on a base class pointer and the destructor is not virtual, the result is going to be undefined behavior (although you might not get a crash).

Always declare the destructor as virtual in any class which is meant to be derived from. If the base class does not need to have a destructor, include a virtual one anyway with an empty body.

There is an exception to the above rule for an edge case: if your derived classes do not need to support polymorphic destruction, then the destructor does not need to be virtual. In this case it would be correct to make it protected instead; more details here, but be advised that this rarely occurs in practice.