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
    };
    
  • 维基百科还提出了一个有趣的观点:

    请注意, overridefinal都不是语言关键字。 它们在技术上是标识符; 在这些特定的环境下使用它们只会获得特殊的含义在任何其他位置,它们可以是有效的标识符。


    “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()的派生类中调用。

    链接地址: http://www.djcxy.com/p/89619.html

    上一篇: What is the purpose of the "final" keyword in C++11 for functions?

    下一篇: c++