C中的'override'关键字是做什么用的?

新手上路,请多包涵

我是 C++ 的初学者。我遇到了 override 我正在处理的头文件中使用的关键字。请问 override 的真正用途是什么,也许举个例子就很容易理解了。

原文由 SKPS 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 755
2 个回答

override 关键字有两个用途:

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

解释后者:

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

class derived: public base
{
   public:
     int foo(float x) override { ... } // OK
};

class derived2: public base
{
   public:
     int foo(int x) override { ... } // ERROR
};

derived2 编译器会发出“更改类型”的错误。如果没有 override ,编译器最多会发出警告“您正在隐藏同名的虚拟方法”。

原文由 Mats Petersson 发布,翻译遵循 CC BY-SA 4.0 许可协议

作为所有答案的附录,仅供参考: 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;
}

输出:

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

原文由 zaufi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题