通过删除基类来破坏派生类

时间:2010-07-31 14:08:42

标签: c++ class inheritance pointers

我的情况类似于以下代码:

#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;
}

我希望B在A被摧毁时被摧毁。这可能在它的析构函数中,还是我必须实现一个虚拟的Destroy()方法或类似的东西?

3 个答案:

答案 0 :(得分:3)

根据经验,如果您的任何方法都是虚拟的,那么析构函数也必须是虚拟的。如果不是,则声明的变量类型决定调用哪个析构函数,这几乎不是您想要的。在99.9%的情况下,您希望从运行时类型中获取析构函数。

答案 1 :(得分:1)

  

这可能在它的析构函数中,还是我必须实现一个虚拟的Destroy()方法呢?

制作虚拟的析构函数。

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

如果你的类有虚方法,它应该使用虚析构函数。如果你没有在虚拟方法中使用虚拟析构函数,至少有一些编译器会抱怨。

答案 2 :(得分:0)

如果将运算符“delete”应用于基类指针,则析构函数必须是虚拟的(其他虚方法的存在无关紧要)。例如,在多重继承的情况下,“删除”操作符应用于基类指针将导致内存错误,因为编译器甚至不知道派生对象占用的内存是否开始。