C++关键字-ooverride和final
override
override关键字确保你在派生类中正确地重写了一个虚函数。
override确保:
- 基类中存在一个同名的虚函数。
- 派生类中重写的函数签名(函数名、参数列表和常量性)与基类虚函数完全匹配。
如果不满足上面任何一条,编译器就会报错。
class Base {
   virtual void foo() const {
     std::cout << "This is from Base." << std::endl;
   }
 };
 
 class Derivied : Base {
   virtual void foo() { // 派生类和基类的函数签名不一样
     std::cout << "This is from Derived." << std::endl;
   }
 };
 
 void bar(Base& base) {
   base.foo();
 }
 
 int main() {
   Derived d;
   bar(d);  //派生类隐式转换为基类,没有表现多态:"This is from Base."
 }
使用override:
 class Derivied : Base {
   virtual void foo() override { // 派生类和基类的函数签名不一样, 编译器报错
     std::cout << "This is from Derived." << std::endl;
   }
 };
派生类重写基类的虚函数时,可以加virtual,但不是必须的,它的virtual属性会自动继承到所有派生类中,建议:
- 只在基类的虚函数上加virtual关键字,其余的派生类重写虚函数不加virtual,但要统一加上override。
final
final有2个用法:
- 防止派生类重写基类的虚函数。
- 防止类被继承。
防止派生类重写基类的虚函数
class Base {
   virtual void foo() {}
   virtual void bar() final {}
 };
 
 class Derivied : Base {
    void foo() override {} // ok
    void bar() override {} // 编译器报错
 };
防止类被继承
class Base final {};
// 编译器报错
class Derived : public Base {};