我是C ++的初学者。我遇到了我正在处理的头文件中使用的override
关键字。我可以知道,override
的实际用途,或许有一个例子很容易理解。
答案 0 :(得分:262)
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
中,编译器将为"更改类型"发出错误。如果没有override
,编译器最多会给出一个警告"您正在隐藏同名虚拟方法"。
答案 1 :(得分:57)
作为所有答案的附录,仅供参考: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()
答案 2 :(得分:8)
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()
,它将定义一个名为{{的新方法1}}而不是。
答案 3 :(得分:1)
维基百科说:
在面向对象编程中,方法重写是一种语言功能,它允许子类或子类提供已由其某个超类或父类提供的方法的特定实现。
详细地说,当你有一个具有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!");
}