C ++中的“override”关键字是什么?
我是C ++的初学者。 我遇到了我正在处理的头文件中使用的override
关键字。 请问我知道,什么是override
真正用途,也许有一个例子会很容易理解。
override
关键字有两个用途:
- 它向读者展示了这个代码:“这是一个虚拟的方法,它覆盖了基类的虚拟方法”。
- 编译器也知道这是一个覆盖,所以它可以“检查”你没有改变/添加你认为是覆盖的新方法。
解释后者:
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 { ... } };
在derived2
编译器将发出“更改types”的错误。 如果没有override
,编译器最多会给出一个警告“你正在隐藏同名的虚拟方法”。
并作为所有响应的附录,FYI: override
不是一个关键字 ,而是一种特殊的标识符! 它只在声明/定义虚拟函数的上下文中有意义,在其他上下文中它只是一个序号。 详情请阅读标准 2.11.2。
// kate: hl C++11; #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()
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 ()。
维基百科说:
在面向对象编程中,方法重写是一种语言特性,它允许子类或子类提供已由其超类或父类之一提供的方法的特定实现。
详细地说,当你有一个具有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!"); }