我的情况类似于以下代码:
#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()方法或类似的东西?
答案 0 :(得分:3)
根据经验,如果您的任何方法都是虚拟的,那么析构函数也必须是虚拟的。如果不是,则声明的变量类型决定调用哪个析构函数,这几乎不是您想要的。在99.9%的情况下,您希望从运行时类型中获取析构函数。
答案 1 :(得分:1)
这可能在它的析构函数中,还是我必须实现一个虚拟的Destroy()方法呢?
制作虚拟的析构函数。
virtual ~A() { std::cout << "A destroyed!" << std::endl; }
如果你的类有虚方法,它应该使用虚析构函数。如果你没有在虚拟方法中使用虚拟析构函数,至少有一些编译器会抱怨。
答案 2 :(得分:0)
如果将运算符“delete”应用于基类指针,则析构函数必须是虚拟的(其他虚方法的存在无关紧要)。例如,在多重继承的情况下,“删除”操作符应用于基类指针将导致内存错误,因为编译器甚至不知道派生对象占用的内存是否开始。