是否存在任何情况下派生类具有非virtual
析构函数?一个非virtual
析构函数表示一个类不应该被用作基类。将有一个非virtual
派生类的析构函数就像 Java 的弱形式final
修改器?
我对派生类的基类具有一个的情况特别感兴趣virtual
析构函数。
是否存在任何情况下派生衍生品是合法的?
类有一个非虚拟析构函数?
Yes.
非虚拟析构函数表示类不应用作
一个基类。
并不真地;非虚拟析构函数表示删除derived
via a base
指针将不起作用。例如:
class Base {};
class Derived : public Base {};
Base* b = new Derived;
delete b; // Does not call Derived's destructor!
如果你不这样做delete
按照上面的方法,就可以了。但如果是这种情况,那么您可能会使用组合而不是继承。
派生类的非虚拟析构函数会像
Java Final 修饰符的弱形式?
没有为什么virtual
-ness 传播到派生类。
class Base
{
public:
virtual ~Base() {}
virtual void Foo() {};
};
class Derived : public Base
{
public:
~Derived() {} // Will also be virtual
void Foo() {}; // Will also be virtual
};
以下是 C++11 标准的摘录,对此进行了形式化:
[...] 如果一个类有一个带有虚拟析构函数的基类,那么它的析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。
- [class.dtor] p9 https://timsong-cpp.github.io/cppwp/n3337/class.dtor#9
C++03 或更早版本中没有内置的语言机制来防止子类 (*)。无论如何,这不是什么大问题,因为你应该始终更喜欢组合而不是继承 https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance。也就是说,当“is-a”关系比真正的“has-a”关系更有意义时,请使用继承。
(*) C++11 中引入了“final”修饰符
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)