-
什么是override?
- override 是C++11引进的一个说明符,翻译为
覆盖
的意思。C++11 中的 override 关键字,可以显式的在派生类中声明,哪些成员函数需要被重写,如果没被重写,则编译器会报错。
- override 是C++11引进的一个说明符,翻译为
-
override有什么用?
- 在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明(declaration),而我们在实现时,就需要实现接口声明的所有方法。
- 在程序中加override 关键字,可以避免派生类中忘记重写虚函数的错误。
- 另一个典型应用就是在继承中使用,在子类中覆盖实现父类的方法。
-
注意事项
- 在派生类的成员函数中使用override时,如果基类中无此函数,或基类中的函数并不是虚函数,编译器会给出相关错误信息。
-
相关代码示例
#include <iostream>
using namespace std;
// 没有使用override
class Base
{
public:
virtual void foo() {
cout << "Base::foo" << endl; }
virtual void goo() {
cout << "Base::goo" << endl; }
// ...
};
class Derived : public Base
{
public:
void foo() {
cout << "Derived::foo" << endl; }
void gao() {
cout << "Derived::goo" << endl; } // 错误的将goo写成了gao,但编译器并不会给出提示
// ...
};
/*
// 使用override
class Base
{
public:
virtual void foo() { cout << "Base::foo()" << endl;}
virtual void bar() { cout << "Base::bar()" << endl;}
void goo() { cout << "Base::goo()" << endl;}
};
class Derived : public Base
{
public:
// ok
void foo() override { cout << "Derived::foo()" << endl;}
// error: Derived::foo does not override. 子类重写父类的函数,两者函数声明不一致
void foo() const override { cout << "Derived::foo()" << endl;}
// error: Base::goo is not virtual
void goo() override { cout << "Derived::goo()" << endl; }
// error: 将bar误写成了bao,且基类中没有名为bao的虚函数
// 由于使用了override,编译器会报错误
void bao() override { cout << "Derived::bao()" << endl;}
};
*/
int main(void)
{
Derived d;
d.foo(); // Derived::foo
d.goo(); // Base::goo 没有具体的子类实现,这不是我们想要的结果
return 0;
}