C ++ 11中的“final”关键字用于函数的目的是什么?
C ++ 11中final
关键字用于函数的目的是什么? 我知道它可以防止派生类重写函数,但是如果是这种情况,那么将它声明为非虚拟的final
函数还不够吗? 我在这里错过了另一件事吗?
你缺少的东西,正如idljarn在评论中已经提到的那样,如果你从基类中覆盖了一个函数,那么你不可能将它标记为非虚拟的:
struct base {
virtual void f();
};
struct derived : base {
void f() final; // virtual as it overrides base::f
};
struct mostderived : derived {
//void f(); // error: cannot override!
};
这是为了防止类被继承。 维基百科:
C ++ 11还增加了防止从类继承或简单地防止派生类中的重写方法的功能。 这是通过特殊标识符final来完成的。 例如:
struct Base1 final { };
struct Derived1 : Base1 { }; // ill-formed because the class Base1
// has been marked final
它也用于标记一个虚函数,以防止它在派生类中被覆盖:
struct Base2 {
virtual void f() final;
};
struct Derived2 : Base2 {
void f(); // ill-formed because the virtual function Base2::f has
// been marked final
};
维基百科还提出了一个有趣的观点:
请注意, override
和final
都不是语言关键字。 它们在技术上是标识符; 在这些特定的环境下使用它们只会获得特殊的含义 。 在任何其他位置,它们可以是有效的标识符。
“final”还允许编译器优化绕过间接调用:
class IAbstract
{
public:
virtual void DoSomething() = 0;
};
class CDerived : public IAbstract
{
void DoSomething() final { m_x = 1 ; }
void Blah( void ) { DoSomething(); }
};
使用“final”时,编译器可以直接从Blah()
内调用CDerived::DoSomething()
Blah()
,甚至可以内联。 没有它,它必须在Blah()
内部生成一个间接调用,因为Blah()
可以在重写DoSomething()
的派生类中调用。
上一篇: What is the purpose of the "final" keyword in C++11 for functions?
下一篇: c++