一、override关键字是什么?
override关键字,是C++11标准引进的一种新特性,它可以用来强制子类重写父类虚函数。在子类中使用override关键字,声明子类中的函数重写了父类中的虚函数。C++编译器会在编译时检查虚函数的重写是否正确,在代码出现错误时会让编译器直接报错。
class Base { public: virtual void foo() { std::cout << "Base foo." << std::endl; } }; class Derived : public Base { public: void foo() override { // 子类重写父类虚函数 std::cout << "Derived foo." << std::endl; } };
二、override关键字的作用
override关键字有两个作用:
第一,override可以让编译器在编译时检查子类是否正确地重写了父类的虚函数。
第二,若子类没有正确地重写了父类的虚函数,编译器会产生一个错误提示。这个错误是在编译时检查的,因此可以避免在运行时出现问题。
三、override的使用范围
override关键字只能用于虚函数的重写,不能用于非虚函数或静态函数的重载。
class Base { public: virtual void foo() { std::cout << "Base foo." << std::endl; } void bar() { std::cout << "Base bar." << std::endl; } }; class Derived : public Base { public: void foo() override { // 子类重写父类虚函数 std::cout << "Derived foo." << std::endl; } void bar() override { // 错误示范,不是虚函数不能重写 std::cout << "Derived bar." << std::endl; } };
四、override的一些注意事项
1、如果父类的虚函数是纯虚函数,子类必须实现这个虚函数,此时可以将子类中的虚函数定义成纯虚函数。
class Base { public: virtual void foo() = 0; // 纯虚函数 }; class Derived : public Base { public: void foo() override { // 子类必须实现纯虚函数 std::cout << "Derived foo." << std::endl; } };
2、override关键字必须在虚函数的声明和定义中都使用才会起作用。如果只在虚函数的声明或定义中使用override关键字,编译是会出现错误的。
class Base { public: virtual void foo(); }; class Derived : public Base { public: void foo() override; // 声明中使用override关键字 }; void Derived::foo() { // 定义中没有使用override关键字,编译错误 std::cout << "Derived foo." << std::endl; }
3、override关键字只能用于派生类对基类的虚函数的重写,不能用于基类内部重载的函数之间。
class Base { public: virtual void foo(int a); virtual void foo(float b); }; class Derived : public Base { public: void foo(int a) override; // 子类重写父类中的foo(int) void foo(float b) override; // 子类重写父类中的foo(float) void foo(double c); // 新增函数,不是虚函数,不会触发override关键字 };
五、总结
在继承中使用override关键字可以强制派生类对基类中相同签名的虚函数进行重写。override关键字的使用可以提高程序的健壮性,可以避免在运行时出现一些难以调试的问题。注意使用override关键字时需要满足一些条件。
原创文章,作者:CDOWR,如若转载,请注明出处:https://www.506064.com/n/370716.html