服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++中Overload,Override,Hide之间的区别

C++中Overload,Override,Hide之间的区别

2020-12-26 16:07C++教程网 C/C++

重载overload,这个概念是大家熟知的。在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载

一. 简介
Overload:
重载,指函数同名,但是参数个数不同、或者参数类型不同的多个实现。(如果参数相同但是仅仅返回值不同不是重载,编译器会报错。)

编译器判断重载函数:
•第一步,
是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。

•第二步,分为两动作:第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同,或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值;第二个动作是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。

•第三步,从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。

Override(想不到比较贴切的翻译)指在继承时,父类函数声明为 virtual , 子类重新声明和实现该函数(函数名和参数完全相同,返回值不做约束)。子类该函数可以声明为 virtual ,也可以不加,不做限制,但是如果该子类还会继续被重载,则最好也声明为 virtual 。正是因为有virtual和Override的机制,C++才能够实现多态。

Hide继承结构中的函数隐藏,指父类中声明了函数,子类中声明和定义了完全一致的函数,但是父类中函数没有声明为vitual,此时子类中的同名同参数函数会完全隐藏父类的函数。貌似和Override很像,但是其实现机制和Override完全不同,且会导致问题,应该避免使用。( virtual机制是使用虚表(vtable)实现的,虚表维护一个虚函数指针列表,但一个对象的某个虚函数被调用的时候,去虚表中查找并决定调用的是哪个函数,具体的实现,小编下次在讲。)

复制代码 代码如下:

class Super
{
public:
void go() { cout << "go() called on Super" << endl; }
};
class Sub : public Super
{
public:
void go() { cout << "go() called on Sub" << endl; }
};
Sub mySub;
mySub.go(); // output: go() called on Sub
Super& ref = mySub;
ref.go(); //output: go() called on Super


也许你希望它会调用子类的函数,但这可能和你的预期完全不同。

 

二. 总结
重载overload,这个概念是大家熟知的。在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载。重载不关心函数的返回值类型,即返回类型不同无法构成重载。此外,C++ 中的const成员函数也可以构成overload。

总结一下重载的特征:
1、处在相同的空间中,即相同的范围内;
2、函数名相同;
3、参数不同,即参数个数不同,或相同位置的参数类型不同;
4、const成员函数可以和非const成员函数形成重载;
5、virtual关键字、返回类型对是否够成重载无任何影响。

覆盖override,是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖,特征是:   

1、不同的范围(分别位于派生类与基类);      
2、函数名字相同;      
3、参数相同;      
4、基类函数必须有virtual关键字。 

针对上述两个概念,还有一个隐藏hide。所谓的隐藏,指的是派生类类型的对象、指针、引用访问基类和派生类都有的同名函数时,访问的是派生类的函数,即隐藏了基类的同名函数。隐藏规则的底层原因其实是C++的名字解析过程。在继承机制下,派生类的类域被嵌套在基类的类域中。派生类的名字解析过程如下:

1、首先在派生类类域中查找该名字。
2、如果第一步中没有成功查找到该名字,即在派生类的类域中无法对该名字进行解析,则编译器在外围基类类域对查找该名字的定义。

总结一下隐藏的特征:
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。   

2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

延伸 · 阅读

精彩推荐
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16