[英]Default to making classes either `final` or give them a virtual destructor?
[英]Should classes be final by default?
引用Effective C ++(Scott Meyers),第三版,第7项:
在多态基类中声明析构函数是虚拟的。
这意味着要继承的类至少应该具有析构函数virtual。
在编写一些应用程序/库时,有些类(我会说并不少)不是为了继承而设计的。 我们通常依赖于一些约定,其中一个不应该继承不属于他自己的类或者不检查它是否安全。
现在,编码标准可能需要编写和设计类,以便继承始终是安全的。 我觉得这可能太多了。 C ++ 11添加了final
关键字,确保不继承类。 您是否建议将默认情况下未设计为继承的所有类标记为final
?
这将使编译器强制执行我们多年来一直遵循的惯例。 但是,可以认为该约定已经被充分理解并且易于遵循(特别是因为通常避免继承,并且优选组合),因此在编写代码时可能只是另一件事。
仅仅因为一个类没有任何虚函数并不意味着从它继承就没有意义了。 它只是意味着它可能没有意图,你必须小心不要通过指向基类的指针删除任何派生对象的实例。 private
继承通常会在这种情况下使用,作为组合的替代,表示继承自base的纯粹是一个实现细节,并且派生类不被视为与base具有“is-a”关系。
标记一个类final
是一种很好的方式来表达一个类本来不是要通过使它成为不可能而衍生出来的。 因此,如果这是你想要的,一个巴掌final
的类。
在某些情况下,标记(派生)类final
以防止任何进一步的派生也可以具有使编译器更容易使函数调用虚拟化的额外好处,从而在某些情况下导致更好的性能。
在我看来, final
应该(通常)是默认值,然后如果你发现你需要/想要从类中派生出来,你可以稍后删除它。 但这只是意见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.