C++中的'override'关键字用于什么?

Sat*_*evi 184 c++ overriding c++11

我是C++的初学者.我遇到override了我正在处理的头文件中使用的关键字.我可以知道,真正的用途是什么override,或许用一个例子就很容易理解.

Mat*_*son 282

override关键字有两个用途:

  1. 它向代码的读者显示"这是一个虚拟方法,它覆盖了基类的虚方法".
  2. 编译器也知道它是一个覆盖,因此它可以"检查"你没有改变/添加你认为是覆盖的新方法.

解释后者:

class base
{
  public:
    virtual int foo(float x) = 0; 
};


class derived: public base
{
   public:
     int foo(float x) override { ... do stuff with x and such ... }
}

class derived2: public base
{
   public:
     int foo(int x) override { ... } 
};
Run Code Online (Sandbox Code Playgroud)

derived2编译器中将发出"更改类型"的错误.如果没有override,编译器最多会发出警告"你正在隐藏同名虚拟方法".

  • 嗯,这完全是重点,代码示例显示了如何使用覆盖来检测错误! (32认同)

zau*_*ufi 64

作为所有答案的补充,FYI:override 不是关键字,而是一种特殊的标识符!它仅在声明/定义虚函数的上下文中有意义,在其他上下文中它只是一个序数标识符.有关详细信息,请阅读标准 2.11.2 .

#include <iostream>

struct base
{
    virtual void foo() = 0;
};

struct derived : base
{
    virtual void foo() override
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

int main()
{
    base* override = new derived();
    override->foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

zaufi@gentop /work/tests $ g++ -std=c++11 -o override-test override-test.cc
zaufi@gentop /work/tests $ ./override-test
virtual void derived::foo()
Run Code Online (Sandbox Code Playgroud)

  • @FerencDajka 1.为什么会这样?2.突然添加一个新关键字(即禁止在其他地方使用它)会破坏向后兼容性. (4认同)
  • 它可以工作(这里和`final`),因为你不能使用常规标识符来放置这些上下文关键字. (3认同)

xor*_*guy 9

override是一个C++ 11关键字,这意味着一个方法是来自基类的方法的"覆盖".考虑这个例子:

   class Foo
   {
   public:
        virtual void func1();
   }

   class Bar : public Foo
   {
   public:
        void func1() override;
   }
Run Code Online (Sandbox Code Playgroud)

如果B::func1()签名不等于A::func1()签名,则会生成编译错误,因为B::func1()不会覆盖A::func1(),它将定义一个名为的新方法func1().

  • 根据C++规范,"覆盖"是"具有特殊含义的标识符".但是C#中的这些东西称为上下文关键字. (8认同)