当一个类是更大框架的一部分时,析构函数应该总是虚拟的吗?

Pas*_*cal 3 c++

stackoverflow上有这个问题,它主张Scott Meyers规则只有在该类中有虚函数时才使析构函数成为虚拟.

我在一家拥有大型框架的公司工作,如果您的课程未来可以扩展,那么在编码时不清楚.在那个时间点,也可能无法更改该类(因为它是已发布的包的一部分).

现在想象以下场景:

class A {
public:
  A();
  virtual ~A();
  virtual m();
};

class B : public A {
public:
  B();
  ~B();
};

class C : public B {
public:
  C();
  virtual ~C();
  virtual m();
};
Run Code Online (Sandbox Code Playgroud)

所以我创造了class B,到现在为止,它无法改变.现在class C已创建,并用作B:

B * b = new C();
delete b;
Run Code Online (Sandbox Code Playgroud)

会发生什么事情,C的析构函数永远不会被调用,对吧?

在这种情况下:一个类总是应该有一个虚拟析构函数?

Hco*_*org 9

当基类具有虚析构函数时,从它继承的所有类都自动具有虚析构函数(因此在您的示例中 - B的析构函数是隐式虚拟的)

如果要扩展/继承类,它应该具有虚拟析构函数.