在 C++ 中,override
关键字用于明确地标识一个派生类中的成员函数是重写基类中的虚函数。这一功能引入于 C++11,能够帮助开发者避免由于函数签名错误(如参数或返回值类型不同)而未能正确重写基类函数的情况。使用 override
关键字可以让编译器在编译时检查重写是否成功,若未成功,会给出编译错误提示。
使用场景
当派生类需要重写基类中的虚函数时,通常会使用 override
关键字。这种用法可以提高代码的可读性和安全性,防止因为函数签名不同而导致的错误。
基本用法
1. 基类定义虚函数
class Base {
public:virtual void display() const {std::cout << "Base class display" << std::endl;}
};
2. 派生类重写虚函数,并使用 override
class Derived : public Base {
public:void display() const override { // 使用 overridestd::cout << "Derived class display" << std::endl;}
};
在这个例子中,Derived
类中的 display
函数重写了 Base
类中的 display
函数,并且使用了 override
关键字。这向编译器明确表明,display
是对基类虚函数的重写。
override
的作用
override
的主要作用是防止以下情况:
1. 函数签名不匹配
如果函数签名不完全匹配(比如参数类型或个数不同),编译器会发出错误提示。例如,假设你错误地在派生类中写成了:
class Derived : public Base {
public:void display() override { // 错误:基类的display函数是conststd::cout << "Derived class display" << std::endl;}
};
由于 Base::display
是 const
成员函数,而 Derived::display
缺少 const
,编译器会报错,提示此函数无法重写。
2. 函数名拼写错误
如果函数名拼写错误或参数列表有误,编译器也会给出错误提示。
class Derived : public Base {
public:void dislay() const override { // 错误:拼写错误std::cout << "Derived class dislay" << std::endl;}
};
在这个例子中,由于拼写错误,dislay
并不重写 Base
类中的 display
函数,编译器会检测到并给出错误信息。
总结
override
明确表示派生类中的函数是重写基类中的虚函数。- 通过使用
override
,可以避免函数签名不匹配或者拼写错误,减少隐藏错误的可能性。 - 适合用于任何重写虚函数的场景,建议在编写派生类时养成使用
override
的习惯。
例子
以下是完整的例子展示了如何使用 override
:
#include <iostream>class Base {
public:virtual void show() const {std::cout << "Base show" << std::endl;}virtual void display(int x) {std::cout << "Base display with int " << x << std::endl;}
};class Derived : public Base {
public:void show() const override { // 正确重写std::cout << "Derived show" << std::endl;}void display(int x) override { // 正确重写std::cout << "Derived display with int " << x << std::endl;}
};int main() {Base* basePtr = new Derived();basePtr->show(); // 输出:Derived showbasePtr->display(42); // 输出:Derived display with int 42delete basePtr;return 0;
}
在这个例子中,Derived
类正确重写了 Base
类的虚函数,使用 override
关键字可以确保派生类中的重写函数具有正确的函数签名。