派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,仍然是合法的行为。编译器将认为新定义的这个函数与基类中原有的所有函数都是相互独立的。这时,派生类的 函数没有覆盖掉基类中的版本。就实际编程习惯而言,这种声明往往意味着发生了错误,因为我们可能原本希望派生类生覆盖掉基类中的虚函数,但是一不小心把形参列表弄错了。
要想调试并发现这样的错误非常困难。因此c++11指出可以用override关键字来说明派生类中的虚函数。这么重的好处是使得程序员的意图更加的清晰的同时让编译器也可以为我们发生一些错误,后者在编程实践中显得更加重要。
如果我们使用override标记了某个函数,但该函数并没有覆盖已经存在的虚函数,此时编译器将会报错。
struct A{
virtual void f1(int) const;
virtual void f2();
void f3();
};
struct B : A {
void f1(int) const override; //正确,f1与基类中的f1匹配
void f2(int) override; //错误,A中没有形如f2(int)的函数
void f3() override; //错误,f3()不是虚函数
void f4() override; //错误,A中没有名为f4的虚函数
};
派生类必须在其内部对所有重新定义的虚函数进行声明。派生类可以在这样的函数前加上virtual关键字,但是并不是非得这么做。
c++11允许派生类显示的注明它将使用那个成员函数改写基类的虚函数。具体措施是在该函数的形参列表之后增加一个override关键字。如:
class A{
public:
virtual int getNum();
};
class B : public A{
public:
int getNum() override;
};
c++11允许派生类显示的注明它使用某个成语 函数覆盖它继承的虚函数。具体做法是形参列表后面,或者在const成语函数的const关键字后面,或者在引用成语函数的引用限定符后面添加一个override。