将受保护的析构函数设为虚拟是否有用?

新手上路,请多包涵
/*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 许可协议

阅读 323
2 个回答

举一个例子:假设你有一个实现引用计数的基类。你有一个 addRef 和一个 release 方法并且你希望你的对象被销毁,如果(且 当)内部计数器通过调用 release 达到零 ---

所以,首先你希望你的析构函数受到保护(因为你只想从 release 中销毁对象)。

如果您打算从您的类派生,您还希望您的析构函数是虚拟的,因为每当您想通过指向基类的指针销毁子对象时都需要一个虚拟析构函数(感谢@sharptooth 的提示……)

原文由 MartinStettner 发布,翻译遵循 CC BY-SA 4.0 许可协议

是的,如果您打算在 delete this class Parent 成员函数中执行 --- ,这在 COM 对象中实现 IUnknown::Release() 时非常常见。

原文由 sharptooth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题