重载、隐藏、覆盖的区别

成员函数的重载、隐藏、覆盖有时候难以辨别,如果你还不太理解,请往下看。

首先,我们先了解一下成员函数被重载,覆盖,隐藏的特征。

成员函数被重载的特征:

(1)在同一个类中

(2)函数名相同,参数不同(参数的个数,参数的类型)

(3)无返回值

成员函数被覆盖的特征:

(1)不在同一个类中

(2)函数名相同,参数相同

(3)基类函数必须有vritual关键字

成员函数被隐藏的特征:

(1)不在同一类中

(2)函数名相同,若参数不同,无论有无vritual关键字,基类函数都被隐藏。

若参数相同,基类函数没有vritual关键字,则基类函数被隐藏。

举例:

注:在主函数中会根据参数个数的不同调用不同的函数。

D继承Base,所以D中存在一份Base的成员函数。而在主函数中调用d.show(),输出D中的结果。

这是因为父类Base的成员函数show()被隐藏了。若想输出父类中成员函数的结果,需要加上域名。

即d.Base::show().

函数覆盖

p1是Base类的指针,p1->show()本应该输出基类成员函数的结果。但是此处却输出子类成员函数的结果。原因在于父类的指针指向了子类对象,而子类对象将父类中的覆盖了。

时间: 2024-10-06 17:21:49

重载、隐藏、覆盖的区别的相关文章

重载与覆盖的区别

对于在同一个可访问区内被声明的几个具有不同参数列(参数的类型.个数.顺序不同)的同名函数,程序会根据不同的参数列表来确定具体调用哪个函数,这种机制叫重载(overload),overlaod不关心函数的返回值. 覆盖(override)是指派生类中存在重新定义的函数,其函数名.参数列.返回值类型必须同父类的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中同名函数时,会自动调用子类中的覆盖版本,而不是父类中的被覆盖版本. 成员函数被重载(ov

C++中的虚继承 & 重载隐藏覆盖的讨论

虚继承这个东西用的真不多.估计也就是面试的时候会用到吧.. 可以看这篇文章:<关于C++中的虚拟继承的一些总结> 虚拟基类是为解决多重继承而出现的. 如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存空间,可以将B1.B2对A的继承定义为虚拟继承,而A就成了虚拟基类.实现的代码如下: class A class B1:public virtual A; class B2:public virtual A; class D:public

C++多态,继承,重载,隐藏,覆盖的关系

override->重写(=覆盖).overload->重载.polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法.成员函数的重载(overload).覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 1   重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中: (2)函数名字相同: (3)参数不同: (4)virtual  

成员函数的重载&amp;&amp;隐藏&amp;&amp;覆盖

/* *成员函数的重载,覆盖,隐藏 *重载: *1.相同的范围(在同一个类中) *2.函数名相同 *3.参数不同 *4.virtual关键字可有可无 *覆盖是指派生类覆盖基类的函数,特征是: *1.不同的范围(分别位于基类与派生类中) *2.函数名相同 *3.参数相同 *4.基类函数必须有virtual关键字 */ #include<iostream> using namespace std; class B { public: void f(int x) {cout<<"

java的重写、重载、覆盖的区别

多态性 通过继承,一个类可以用作多种类型:可以用作它自己的类型.任何基类型,或者在实现接口时用作任何接口类型.这称为多态性 重载 每个类型成员都有一个唯一的签名.方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成.只要签名不同,就可以在一种类型内定义具有相同名称的多种方法.当定义两种或多种具有相同名称的方法时,就称作重载.即重载时相同名称成员的参数列表是不相同的(参数顺序和类型). 继承,重写和隐藏成员 (重写 = 覆盖) 派生的类型继承其基本类型的所有成员:也就是说,这些成员是在派

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

C++:重载、覆盖与隐藏

C++之中的重载.覆盖.隐藏 重载 覆盖 重载与覆盖的区别 相关代码 隐藏 重载 重载是指函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数.在同一可访问区域内被声明的几个具有不同参数列表(参数类型.个数.顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数.对于重载函数的调用,在编译期间就已经确定,是静态的,它们的地址在编译期间就绑定了与多态无关. 注意:重载不关心函数的返回值类型 特征: (1)相同的范围(在同一个类中) (2)函数名字相同 (3)参数不

重载和覆盖

说到java中的重载和覆盖呢,大家都很熟悉了吧,但是呢我今天就要写这个. 本文主题: 一.什么是重载 二.什么是覆盖 三.两者之间的区别 重载(overload): 在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了. 即当函数同名时,只看参数列表.和返回值类型没关系. 重载使用的时候需要注意: 1.在使用重载时只能通过不同的参数样式.例如,不同的参数类型,不同的参数个数,不同的参数顺序. 2.方法的异常类型和数目不会对重载造成影响

Java基础知识(重载和覆盖)

重载(overload): 在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了. 即当函数同名时,只看参数列表.和返回值类型没关系. 重载使用的时候需要注意: 1.在使用重载时只能通过不同的参数样式.例如,不同的参数类型,不同的参数个数,不同的参数顺序. 2.方法的异常类型和数目不会对重载造成影响. 3.对于父类来说,子类可以重载与继承父类中的方法同名的方法,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重

C++中重载、覆盖与隐藏的区别(转)

本文摘自林锐博士的<高质量C++/C编程指南>. 成员函数的重载.覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 1. 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual关键字可有可无. 覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类): (2)函数名字相同: (3)参数相同: (4)基类函数必须有virtual关键字. 在下例中,函