管理虚方法:override和final
传统的虚函数是为了实现多态调用,但这必须是派生类与基类的虚函数签名完全一致的情况下才会发生多态,如果不一致,假设如下:
1 class Base 2 { 3 public: 4 virtual void Fn(){ cout << "Base::Fn()" << endl; } 5 }; 6 7 class Derived : public Base 8 { 9 public: 10 virtual void Fn(int){ cout << "Derived::Fn()" << endl; } 11 }; 12 13 int main() 14 { 15 Base* d = new Derived; 16 d->Fn(); 17 18 return 0; 19 }
结果如上,编译器竟然会根据指针的静态类型发生了调用,并无多态发生。
好在C++ 11提供了override指出了该虚函数是为了覆盖基类的虚函数而存在的,此时如果不小心与基类中的虚函数不一致了,那么编译器不会让你通过的。
1 class Derived : public Base 2 { 3 public: 4 virtual void Fn(int) override{ cout << "Derived::Fn()" << endl; } 5 };
如果想禁止派生类覆盖基类的虚函数,可在基类的虚函数参数列表后加上final。
1 class Base 2 { 3 public: 4 virtual void Fn() final{ cout << "Base::Fn()" << endl; } 5 }; 6 7 class Derived : public Base 8 { 9 public: 10 virtual void Fn() override{ cout << "Derived::Fn()" << endl; } 11 };
最后需要指出的是:override和final并非关键字,而是具有特殊含义的标识符,编译器会根据上下文确定其到底是否代表特殊性。