tags:

views:

777

answers:

5

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?

+5  A: 

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, please see the code below:

class B
{
public:
    virtual ~B()
    {
     cout<<"B destructor"<<endl;
    }
};


class D : public B
{
public:
    virtual ~D()
    {
     cout<<"D destructor"<<endl;
    }
};

When you do:

B *pD = new D();
delete pD;

Then if you did not have a virtual destructor only ~B() would be called. But since you have a virtual destructor, first ~D() will be called, then ~B().

Brian R. Bondy
+1  A: 

No. It's automatically called.

Benoît
+21  A: 

No, destructors are called automatically in the reverse order of construction. (Base classes last). Do not call base class destructors.

Lou Franco
+2  A: 

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 virtul, as you do in the base class, all derived destructors will be virtual whether you declare them so or not. In other words:

struct A {
   virtual ~A() {}
};

struct B : public A {
   virtual ~B() {}   // this is virtual
};

struct C : public A {
   ~C() {}          // this is virtual too
};
anon
A: 

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.

itsmatt