/*Child is inherited from Parent*/
class Parent {
public:
Parent () //Constructor
{
cout << "\n Parent constructor called\n" << endl;
}
protected:
~Parent() //Dtor
{
cout << "\n Parent destructor called\n" << endl;
}
};
class Child : public Parent
{
public:
Child () //Ctor
{
cout << "\nChild constructor called\n" << endl;
}
~Child() //dtor
{
cout << "\nChild destructor called\n" << endl;
}
};
int main ()
{
Parent * p2 = new Child;
delete p2;
return 0;
}
如果我将 Parent
的析构函数设为虚拟,则会出现错误,那么将受保护的析构函数设为虚拟的目的是什么?
原文由 tusharfloyd 发布,翻译遵循 CC BY-SA 4.0 许可协议
举一个例子:假设你有一个实现引用计数的基类。你有一个
addRef
和一个release
方法并且你希望你的对象被销毁,如果(且 仅 当)内部计数器通过调用release
达到零---
。所以,首先你希望你的析构函数受到保护(因为你只想从
release
中销毁对象)。如果您打算从您的类派生,您还希望您的析构函数是虚拟的,因为每当您想通过指向基类的指针销毁子对象时都需要一个虚拟析构函数(感谢@sharptooth 的提示……)