为什么要为C++中的抽象类声明一个虚拟析构函数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (468)

我知道在C++中为基类声明虚拟析构函数是一个很好的实践,但是声明总是很重要吗?virtual析构函数,甚至是作为接口的抽象类?请提供一些理由和例子。

提问于
用户回答回答于

对于一个接口来说,它甚至更重要。类的任何用户都可能持有指向接口的指针,而不是指向具体实现的指针。当他们删除它时,如果析构函数是非虚拟的,他们将调用接口的析构函数(或者编译器提供的默认值,如果没有指定),而不是调用派生类的析构函数。即时内存泄漏。

例如

class Interface
{
   virtual void doSomething() = 0;
};

class Derived : public Interface
{
   Derived();
   ~Derived() 
   {
      // Do some important cleanup...
   }
};

void myFunc(void)
{
   Interface* p = new Derived();
   // The behaviour of the next line is undefined. It probably 
   // calls Interface::~Interface, not Derived::~Derived
   delete p; 
}
用户回答回答于

并不总是。如果抽象类禁止客户端调用指向它的指针上的DELETE(或者在其文档中这样说),则可以不声明虚拟析构函数。

可以通过保护其析构函数来禁止客户端调用指向它的指针上的DELETE。省略一个虚拟析构函数是完全安全和合理的。

扫码关注云+社区

领取腾讯云代金券