内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
如果我有一个虚拟析构函数的基类。有派生类来声明虚拟析构函数吗?
class base {
public:
virtual ~base () {}
};
class derived : base {
public:
virtual ~derived () {} // 1)
~derived () {} // 2)
};
具体问题:
声明派生析构函数的最佳做法是什么?如果可能,声明是虚拟的还是非虚拟的?
派生类不声明虚拟事物并不能阻止它虚拟化。实际上,如果在基类中是虚拟的,则无法阻止任何方法(包括析构函数)在派生类中虚拟化。在> = C ++ 11中,可以使用final
它来防止它在派生类中被重写,但这并不妨碍它成为虚拟的。
如果派生类中的析构函数无关,可以省略它。它的虚拟与否并不重要。
virtual
为了清晰起见,我总是在派生类中再次使用关键字来实现虚函数。人们不应该一直沿着继承层次去找出函数是虚拟的。此外,如果你的类是可复制或可移动的,而无需声明你自己的副本或移动构造函数,则声明任何类型的析构函数(即使将其定义为default
)也会强制你声明副本并移动构造函数和赋值运算符因为编译器将不再为你提供它们。