C++ -- override 关键字
override 作用
override 是 C++11 引入的一个关键字,用于显式地声明派生类中的虚函数重写了基类的某个虚函数。
1.告知编译器和阅读代码的人,该函数旨在重写基类的一个虚函数。
2.如果基类没有对应的可重写虚函数,或者函数签名不完全匹配,编译器将直接报错,阻止潜在的隐藏错误。
示例代码:
#include <iostream>
class Base
{
public:
Base() = default;
~Base() = default;
virtual void func()
{
std::cout << "Base func." << std::endl;
}
};
class Derived : public Base
{
public:
Derived() = default;
~Derived() = default;
void func() override
{
std::cout << "Derived func." << std::endl;
}
};
int main()
{
Base *b = new Derived();
b->func();
return 0;
}
上述代码的输出是Derived func. 我们定义的指针对象 b 的静态类型是Base*,动态类型是Derived*,在运行时根据其动态类型调用了Derived类中的成员函数。
能否不使用 override
答案是可以的,override 本身不影响代码逻辑的实现。
C++中虚函数重写的规则:只要函数签名相同,基类函数是虚的,派生类定义就会重写,无论是否使用override关键字。override只是显式声明,让编译器检查是否真的重写了基类虚函数,如果不匹配则报错。
测试程序如下:
#include <iostream>
class Base
{
public:
Base() = default;
~Base() = default;
virtual void func()
{
std::cout << "Base func." << std::endl;
}
};
class Derived : public Base
{
public:
Derived() = default;
~Derived() = default;
void func()
{
std::cout << "Derived func." << std::endl;
}
};
int main()
{
Base *b = new Derived();
b->func();
return 0;
}
我们删掉了override关键字,代码的输出依然是Derived func.。
但是在实际开发中为了提高代码的可维护性以及可读性,更规范地开发仍需要使用override关键字。
【这个问题面试的时候没有回答上,真悲伤....】
隐藏基类函数的情况
该小节与 override 关键字无关,只是一起整理了。
若派生类有与基类的同名函数,参数列表不同,将会隐藏基类的函数。即派生类中无法查到到基类中被隐藏的函数。
#include <iostream>
class Base
{
public:
Base() = default;
~Base() = default;
virtual void func()
{
std::cout << "Base func." << std::endl;
}
};
class Derived : public Base
{
public:
Derived() = default;
~Derived() = default;
void func(int a) // 重载版本
{
std::cout << "Derived overload." << std::endl;
}
};
int main()
{
Derived *d = new Derived();
d->func(); // 会报错,因为基类的func()被隐藏了
d->func(3);
return 0;
}
上述代码d->func();会出现报错,因为基类的func()函数被隐藏了。

浙公网安备 33010602011771号