作用
如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。
override明确表示该函数是对基类中的一个虚函数的重写。
重写虚函数时,容易犯的错误
class Base
{
public:
virtual void fun1() const;
virtual void fun2(int x);
virtual void fun3() &;
void fun4() const; // is not declared virtual in Base
};
class Derived : public Base
{
public:
// 缺少const
virtual void fun1();
// 参数时uint,与基类不一致
virtual void fun2(unsigned int x);
// 右值引用,基类是左值引用
virtual void fun3() &&;
void fun4() const;
};
在这段代码中,子类本意是想重写父类的函数,但是参数、限定符等与父类不一致,导致“重写”成了“重载”,代码编译正确,但不符合作者本意。面对这种情况,override就派上用场了。
在派生类中,重写继承自基类成员函数的实现时,要满足记打条件:
基类中,成员函数被声明为virtual。
基类和派生类中,成员函数的返回类型和异常规格必须兼容。
基类和派生类中,成员函数名、形参类型、常量属性和引用限定符必须完全相同。
因为有如此多的限定条件导致虚函数重写如上面代码,很容易不小心出错。
C++11中的override关键字,可以显示的在派生类中声明,哪些成员函数需要被重写,如果没被重写,则编译器会报错。
class Base
{
public:
virtual void fun1() const;
virtual void fun2(int x);
virtual void fun3()&;
void fun4() const; // is not declared virtual in Base
};
class Derived : public Base
{
public:
void fun1() override {};
void fun2(unsigned int x) override {};
void fun3() && override {};
void fun4() const {};
};
如上代码,加上override限定符后,若不满足重写条件,编译器即会报错。
如果是重写基类成员函数,最好都加上override限定符。