views:

58

answers:

3

Hello, I have a situation that looks like the following code:

#include <iostream>

class A
{
public:
    A() { std::cout << "A created!" << std::endl; }
    ~A() { std::cout << "A destroyed!" << std::endl; }

    virtual const char* Name() { return "A"; }
};

class B : public A
{
public:
    B() { std::cout << "B created!" << std::endl; }
    ~B() { std::cout << "B destroyed!" << std::endl; }

    const char* Name() { return "B"; }
};

int main()
{
    A* a = new B();

    std::cout << a->Name() << "\n";

    delete a;

    return 0;
}

I want B to be destroyed when A is destroyed too. Is this possible in its destructor or do I have to implement a virtual Destroy() method or something like that?

+3  A: 

As a rule of thumb, if any of your methods are virtual, the destructor must also be virtual. If it isn't, the declared type of a variable decides which destructor gets called, which is almost never what you want. 99.9% of all cases, you want the destructor from the runtime type.

tdammers
Actually, if it isn't what you get is undefined.
anon
+1  A: 

Is this possible in its destructor or do I have to implement a virtual Destroy() method or something like that?

Make destructor of A virtual.

 virtual ~A() { std::cout << "A destroyed!" << std::endl; }

If your class have virtual methods, it should use virtual destructor. At least some compilers will complain if you aren't using virtual destructor in class with virtual methods.

SigTerm
@Sig which compilers? The C++ Standard certainly allows it.
anon
@Neil Butterworth: `Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86` `warning C4265: 'A' : class has virtual functions, but destructor is not virtual instances of this class may not be destructed correctly` VS express 2008. "Complain" means "warnings".
SigTerm
A: 

If you apply operator "delete" to base class pointer, destructor MUST be virtual (existance of other virtual methods does not matter). For instance, in case of multiple iheritance "delete" operator applied to base class pointer will cause memory fault since compiler doesn't even know were the memory occupied by derived object begins.