C++中override的作用
override关键字作用:
如果派生类在虚函数声明时使用了override描述符,
那么该函数必kif须重载其r基类中的同名函数,否则代码将无法通过编译。
C++ override从字面意思上,是覆盖的意思,实际上在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。override是C++11中的一个继承控制关键字。overr,jfhide确保在派生类中声明的重载函数跟基类的虚函数有相同的声明。
override明ns确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和。gj派生类中重载函数的签名不匹配问题。如果签名不匹配,编译器会发出错误信息。
override表示函数应当重写基类中的虚函数(用于派生类的虚函数中)。
在我们C++编程过程中,最熟悉bgf的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。还有一个典型应用就是在继承中也可能会在子类覆盖父类的方法。
公有继承包含两部分:一是“接口”(interface),二是 “实现” (implementation)。
前面的基类 Fish 都包含虚函数 Swim(),如下面的代码所示:
class Fish
{
public:
virtual void Swim()
{
cout << "Fish swims!" << endl;
}
};
假设派生类 Tuna 要定义函数 Swim(),但特征标稍微不同—程序员原本想覆盖 Finish::Swim(),
但不小心插入了关键字 const,如下所示:
class Tuna:public Fish
{
public:
void Swim() const
{
cout << "Tuna swims!" << endl;
}
};
在这种情况下,函数 Tuna::Swim()实际上并不会覆盖 Finish::Swim(),这是因为 Tuna::Swim()包含
const,导致它们的特征标不同。然而,这些代码能够通过编译,导致程序员误以为他在 Tuna 类中成功
地覆盖了函数 Swim()。从 C++11 起,程序员可使用限定符 override 来核实被覆盖的函数在基类中是否
被声明为虚的:
class Tuna:public Fish
{
public:
void Swim() const override // Error: no virtual fn with this sig in Fish
{
cout << "Tuna swims!" << endl;
}
};
换而言之, override 提供了一种强大的途径,让程序员能够明确地表达对基类的虚函数进行覆盖的
意图,进而让编译器做如下检查:
• 基类函数是否是虚函数?
• 基类中相应虚函数的特征标是否与派生类中被声明为 override 的函数完全相同?
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程