默认情况下,类应该是最终的吗?

时间:2019-04-23 17:59:33

标签: c++

引用有效的C ++(Scott Meyers),第三版,第7项:

  

在多态基类中声明虚拟的析构函数。

这意味着打算从中继承的类至少应具有虚拟的析构函数。

在编写某些应用程序/库时,某些类(我想说的不少)并不是出于继承目的而设计的。我们通常依赖于某些约定,在这些约定中,不应继承不是他自己的类,或者不检查是否安全。

现在,编码标准可能需要编写和设计类,以便继承始终是安全的。我觉得这可能太多了。 C ++ 11添加了final关键字,以确保不继承类。您是否建议默认将所有非继承类都标记为final

这将使编译器强制执行我们多年来一直在做的事情。但是,该约定可能被认为已经足够理解并易于遵循(特别是因为通常避免继承,而更倾向于使用组合),因此编写代码可能只是另一件事。

1 个答案:

答案 0 :(得分:3)

仅因为类不具有任何虚函数,否则意味着从该类继承是没有意义的。这只是意味着它可能不是故意的,您必须注意不要通过指向基类的指针删除派生对象的任何实例。在这种情况下,{em}经常会使用private继承(作为组合的替代方法),以表示从基继承是纯粹的实现细节,而派生类不应被视为与基地有“是”关系。

标记类final是一种很好的方式,可以通过使类不可能表达来表示该类根本不打算从该类派生。因此,如果您要这样做,请在课程上打final

在某些情况下,标记一个(派生的)类final以防止进一步的 派生还可以带来额外的好处,即使编译器更容易对函数调用进行虚拟化,从而导致在某些情况下可以提高性能。

我的看来,final应该(通常)是默认值,如果您发现毕竟需要/想要从该类派生,则可以稍后将其删除。 但这只是意见。