270

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

4

4 回答 4

413

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,编译器最多会发出警告“您正在以相同的名称隐藏虚拟方法”。

于 2013-08-12T23:36:51.293 回答
78

作为所有答案的附录,仅供参考: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()
于 2013-08-12T23:50:08.777 回答
11

override是 C++11 关键字,表示方法是基类方法的“覆盖”。考虑这个例子:

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

   class Bar : public Foo
   {
   public:
        void func1() override;
   }

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

于 2013-08-12T23:33:29.657 回答
0

维基百科说:

在面向对象的编程中,方法覆盖是一种语言功能,它允许子类或子类提供已由其超类或父类之一提供的方法的特定实现。

详细地说,当您有一个具有 void hello() 函数的对象 foo 时:

class foo {
    virtual void hello(); // Code : printf("Hello!");
}

foo 的孩子也将有一个 hello() 函数:

class bar : foo {
    // no functions in here but yet, you can call
    // bar.hello()
}

但是,您可能想要打印“Hello Bar!” 当从 bar 对象调用 hello() 函数时。您可以使用覆盖来执行此操作

class bar : foo {
    virtual void hello() override; // Code : printf("Hello Bar!");
}
于 2013-08-12T23:42:39.443 回答