我是C++的初学者。在我正在使用的头文件中,我遇到了override
关键字。请问,override
的实际用途是什么,最好能举个例子易于理解。
我是C++的初学者。在我正在使用的头文件中,我遇到了override
关键字。请问,override
的实际用途是什么,最好能举个例子易于理解。
override
关键字有两个作用:
解释后一点:
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
,最多编译器只会警告“你正在通过相同的名称隐藏虚方法”。
override
来理解。这真的很难实现。 - Mats Petersson作为所有答案的补充,顺便说一下: 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()
final
中)是因为你不能在这些上下文关键字所在的位置使用普通标识符。 - CTMacUseroverride
是 C++11 的一个关键字,意思是一个方法是从父类继承过来的 "override" 方法。考虑以下例子:
class Foo
{
public:
virtual void func1();
};
class Bar : public Foo
{
public:
void func1() override;
};
B::func1()
的签名和 A::func1()
的签名不相等,编译时会生成一个错误,因为 B::func1()
没有覆盖 A::func1()
,而是定义了一个名为 func1()
的新方法。void func1(int v) override;
,以便编译器发出像marked 'override', but does not override
这样的错误。换句话说,奇怪的是,override似乎是编译器在派生类中使用的提示,以验证基类中存在相同的签名。请参见上面Mats Petersson的答案。 - luv2learn维基百科说:
方法重写(Method overriding)是面向对象编程中的一种语言特性,它允许子类或子类提供一个已经由其超类或父类提供的方法的特定实现。
具体来说,当您有一个具有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()
};
然而,当从一个bar对象调用hello()函数时,您可能希望打印出"Hello Bar!"。您可以使用override来实现这一点。
class bar : foo {
virtual void hello() override; // Code : printf("Hello Bar!");
};
final
关键字。 - Jesse Goodfinal
也不是一个关键字!!!请注意。 - zaufi@Override
启发的东西,让编译器为您进行编译时检查。 - JP Zhang