【发布时间】:2015-08-04 04:50:17
【问题描述】:
stackoverflow 上有 this question,它提倡 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();
};
所以我创建了class B,现在它无法更改。
现在class C 已创建,并用作B:
B * b = new C();
delete b;
C 的析构函数永远不会被调用,会发生什么,对吧?
在这种情况下: 一个类是否应该总是有一个虚拟析构函数?
【问题讨论】:
-
真正的答案是不要滥用继承来扩展类。改用合成。
-
对于遗留代码,使用继承通常是修复错误或行为的唯一方法。例如,我的代码将被重复使用而无法更改。
标签: c++