c++ - 你的析构函数什么时候应该是虚拟的?

标签 c++ virtual-destructor

Possible Duplicate:
When to use virtual destructors?

什么时候你的 C++ 对象的析构函数应该是virtual

最佳答案

  1. 你需要虚拟析构函数 至少一个类方法是 虚拟的。

这是因为虚方法的原因是你要使用多态性。这意味着您将在基类指针上调用一个方法,并且您想要最派生的实现——这就是多态性的全部意义所在。

现在,如果您没有虚拟析构函数,并且通过指向基类的指针调用析构函数,您最终会调用基类析构函数。在这种情况下,您希望多态性也适用于您的析构函数,例如通过在您的基类上调用析构函数,您希望最终调用您的最派生类的析构函数,而不是您的基类。

class A
{
   virtual void f() {}
   ~A() {}
}

class B : public A
{
   void f() {}
   ~B() {}
}

A * thing = new B();
thing->f(); // calls B's f()
delete thing; // calls ~A(), not what you wanted, you wanted ~B()

拥有 ~A() 虚拟会开启多态性

virtual ~A() {}

所以当你现在打电话时

delete thing;

~B() 将被调用。

当您将类设计为接口(interface)时,您将声明虚拟析构函数,例如您希望它得到扩展或实现。在这种情况下,一个好的做法是拥有一个带有虚拟方法和虚拟析构函数的接口(interface)类(在 Java 接口(interface)的意义上),然后拥有具体的实现类。

您可以看到 STL 类没有虚拟析构函数,因此它们不应该被扩展(例如 std::vector、std::string ...)。如果扩展 std::vector 并通过指针或引用在基类上调用析构函数,则绝对不会调用可能导致内存泄漏的专用类析构函数。

关于c++ - 你的析构函数什么时候应该是虚拟的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123044/

相关文章:

c++ - 在第三方软件中派生没有虚拟析构函数的类

c++ - 使用非虚拟析构函数有什么具体原因吗?

c++ - 多态调用3层析构函数

C++ 虚拟析构函数

c++ - 对一个类/文件的 undefined reference 错误

c++ - GetPrivateProfileStringA() 切断我的配置值编号

c++ - 为类型特征排序多个 std::void_t 部分特化的可靠方法

c++ - 在没有事件异常的情况下调用线程终止

c++ - 无法更新控制台应用程序中的窗口

c++ - Keil:虚拟或 protected 析构函数和堆