【发布时间】:2016-08-22 01:22:49
【问题描述】:
C++11 添加了最终版本。
终于!
我知道final 做了两件事:
- 使类不可继承。
- 使类中的(虚拟)函数不可覆盖(在派生类中)。
这两者似乎是相互独立的。但以以下为例:
class Foo
{
public:
virtual void bar()
{
//do something unimportant.
}
};
class Baz final : public Foo
{
public:
void bar() /*final*/ override
{
//do something more important than Foo's bar.
}
};
从上面,我相信Baz是final,我应该不需要指定它的virtual成员函数bar也是@987654327 @。由于Baz 不能被继承,覆盖bar 的问题超出了范围。但是我的编译器 VC++ 2015 对此非常安静。目前我还没有在其他任何人身上测试过。
如果有人能对这个话题有所了解,我会很高兴。来自标准的报价(如果有的话)将不胜感激。还请说明我不知道的任何极端情况,这可能会导致我的逻辑信念失败。
所以,我的问题是:是否有一个 final class 隐含 virtual 功能是 final 也?应该是?请澄清。
我问这个的原因是因为final 函数符合去虚拟化的条件,这是一个很好的优化。任何帮助表示赞赏。
【问题讨论】:
-
final 函数仅在静态类型与函数为 final 的类型匹配时才被去虚拟化。很少发生,通常表明一开始就不需要虚拟。
-
@SergeyA 是的。这就是我写合格的原因。
-
如果编译器可以保证它不需要虚拟调用,那么它就不会植入虚拟调用(作为优化)。编译器很聪明,在引入 final 之前已经这样做了。但我想现在更容易了。
-
如果你将你的类标记为final,你就不能从它继承,因此你不能覆盖它的任何成员函数,那么为什么还要麻烦一个成员函数是否是final呢?
-
允许编译器将
final类的所有成员函数视为声明final