override是C++11中引入的一个关键字,它主要用于派生类重写基类中的虚函数时,对于基类虚函数的覆盖作用。
在C++中,虚函数是通过指针实现多态的重要一种方式。在定义虚函数时,使用virtual关键字将该函数声明为虚函数,并在子类中通过关键字virtual来重写基类中的虚函数。但如果在子类中重写虚函数时,不小心改变了函数签名(比如忘记加const或者参数类型和个数有所改变等),则这个虚函数不再能够像预期那样与基类的虚函数形成“覆盖”关系,导致运行时多态失效。
为了解决这个问题,C++11中引入了override关键字。它显式地表示子类中的虚函数是对父类函数的重写,如果子类中的virtual函数的函数签名与父类中的virtual函数的函数签名不匹配,则编译器会提示错误信息,提醒我们修改代码。
例如:
class Base {
public:
virtual void foo() const {
std::cout << "Base::foo()" << std::endl;
}
};
class Derived : public Base {
public:
virtual void foo() const override {
std::cout << "Derived::foo()" << std::endl;
}
};
int main() {
Base* b = new Derived();
b->foo(); // 输出 Derived::foo()
return 0;
}
在上面的代码中,类Base中定义了一个虚函数foo,派生类Derived继承了基类Base,并重写了基类的虚函数foo。在Derived类中,使用了override关键字显式地表示这是一个对基类虚函数的重写。使用这个关键字可以确保程序员清楚地知道自己在重写基类的哪个虚函数,同时也可以帮助编译器检查出重写虚函数时可能出现的错误。
需要注意的是,override只能用于声明在虚函数中,否则编译器只会把它当成普通的标识符。同时它还是C++11的新特性,要求使用了支持该关键字的编译器。