Mor*_*enn 22 c++ inheritance c++11 gotw
我读的意见终极版约在一周的香草萨特的大师virtual功能,终于看见他提这一点:
[...]"最终的使用是罕见的" - 嗯,他们有点.我不知道很多,在标准化过程中,Bjarne反复询问它解决的问题和应该使用的模式的例子,我不记得任何突出的主要问题.我唯一知道的是,如果你正在定义一个库模块(它还不是标准概念),那么使叶子类最终可以为编译器提供更多信息来虚拟化调用,因为知道库外的代码"进一步推导出来,但我不确定这些日子在整个计划优化(包括积极的虚拟化)的存在下有多重要.
这个答案没有提供很多final关于课程用例的例子,我很想知道它可以解决哪些问题.你知道吗,或者final课堂上只会变成一些模糊不清且几乎未使用过的功能?
我在这里描述了一个有趣的不寻常的用例.简而言之,通过阻止类int类的继承,您可以在库的未来版本中为自己购买内置类型替换它,而不会有破坏用户代码的风险.
但更常见的例子是虚拟化.如果将类标记为final,则编译器可以应用某些运行时优化.例如,
struct Object {
virtual void run() = 0;
virtual ~Object() {}
};
struct Impl final : Object
{
void run() override {}
};
void fun(Impl & i)
{
i.run(); // inlined!
}
Run Code Online (Sandbox Code Playgroud)
i.run()由于final说明符,现在可以内联调用.编译器知道不需要vtable查找.