C++中重载、重写(覆盖)和隐藏的区别

转载自:https://blog.csdn.net/zx3517288/article/details/48976097

基本概念:

重载:是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

1 class A{
2 public:
3   void test(int i);
4   void test(double i);//overload
5   void test(int i, double j);//overload
6   void test(double i, int j);//overload
7   int test(int i);         //错误,非重载。注意重载不关心函数返回类型。
8 };

隐藏:是指派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。

 1 #include "stdafx.h"
 2 #include "iostream"
 3
 4 using namespace std;
 5
 6 class Base
 7 {
 8 public:
 9     void fun(double ,int ){ cout << "Base::fun(double ,int )" << endl; }
10 };
11
12 class Derive : public Base
13 {
14 public:
15     void fun(int ){ cout << "Derive::fun(int )" << endl; }
16 };
17
18 int main()
19 {
20     Derive pd;
21     pd.fun(1);//Derive::fun(int )
22     pb.fun(0.01, 1);//error C2660: “Derive::fun”: 函数不接受 2 个参数
23
24     Base *fd = &pd;
25     fd->fun(1.0,1);//Base::fun(double ,int);
26     fd->fun(1);//error
27     system("pause");
28     return 0;
29 }

重写(覆盖):是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

注:fd为基类的指针,这是调用fun是基类的函数

 1 #include<iostream>
 2
 3 using namespace std;
 4
 5 class Base
 6 {
 7 public:
 8     virtual void fun(int i){ cout << "Base::fun(int) : " << i << endl;}
 9 };
10
11 class Derived : public Base
12 {
13 public:
14     virtual void fun(int i){ cout << "Derived::fun(int) : " << i << endl;}
15 };
16 int main()
17 {
18     Base b;
19     Base * pb = new Derived();
20     pb->fun(3);//Derived::fun(int)
21
22     system("pause");
23     return 0;
24 }

重载和重写的区别:

(1)范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。

(2)参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。

(3)virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。

隐藏和重写,重载的区别:

(1)与重载范围不同:隐藏函数和被隐藏函数在不同类中。

(2)参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。

 1 #include "stdafx.h"
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 class Base
 7 {
 8 public:
 9     virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
10     void g(float x){ cout << "Base::g(float) " << x << endl; }
11     void h(float x){ cout << "Base::h(float) " << x << endl; }
12 };
13
14 class Derived : public Base
15 {
16 public:
17     virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
18     void g(int x){ cout << "Derived::g(int) " << x << endl; }
19     void h(float x){ cout << "Derived::h(float) " << x << endl; }
20 };
21
22 int main(void)
23 {
24     Derived d;
25     Base *pb = &d;
26     Derived *fd = &d;
27     // Good : behavior depends solely on type of the object
28     pb->f(3.14f); //Derived::f(float) 3.14
29     fd->f(3.14f); //Derived::f(float) 3.14
30
31     // Bad : behavior depends on type of the pointer
32     pb->g(3.14f); //Base::g(float) 3.14
33     fd->g(3.14f); //Derived::g(int) 3
34
35     // Bad : behavior depends on type of the pointer
36     pb->h(3.14f); //Base::h(float) 3.14
37     fd->h(3.14f); //Derived::h(float) 3.14
38
39     system("pause");
40     return 0;
41 }

(1)函数Derived::f(float)覆盖了Base::f(float)。

(2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。

(3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。



原文地址:https://www.cnblogs.com/zhangjxblog/p/8723291.html

时间: 2024-08-02 03:50:09

C++中重载、重写(覆盖)和隐藏的区别的相关文章

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

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

C++中成员函数的重载、覆盖和隐藏的区别

转载请注明,原创地址:点击打开链接   http://blog.csdn.net/u010587274/article/details/38928561 个人微信公众号:tanzi_888 (潭子技术圈) C++中成员函数的重载.覆盖和隐藏的区别: 1 重载(overload): 是函数名相同,参数列表不同 重载只是在类的内部存在.但是不能靠返回值类型来判断.1.1)相同的范围(在同一个类中)1.2)函数名字相同1.3)参数不同 1.4)Virtual关键字可有可无 2  覆盖 (overrid

java的重载、覆盖和隐藏的区别

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

C++重载、覆盖、隐藏的区别与举例

参考博客:http://blog.csdn.net/hexi_2000/article/details/4392107 //重载,覆盖,隐藏举例 #include <iostream> using namespace std; class A { public:     int n;     void fun()     {         cout<<"A::fun()"<<endl;     }     virtual void fun(int 

java中重载、覆盖和隐藏三者的区别分析

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

重载、覆盖、隐藏的区别

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数.对于这两个函数的调用,在编译期间就已确定,是静态的.也就是说它们的地址在编译器就绑定了(早绑定),因此重载与多态无关. 覆盖(重写):子类重新定义父类虚函数的方法.当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的.因此,这样的函数地址是在运行期间绑定的(晚绑定),重写与多态相关. 重载的特征       覆盖的特征 1.相

类成员函数中重载/重写(覆盖)/重定义(隐藏)的区别

https://blog.csdn.net/ranxiaoxu123/article/details/52291385 https://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html 原文地址:https://www.cnblogs.com/Kiven5197/p/8934207.html

类成员函数的重载,覆盖和隐藏的区别

1.成员函数被重载的特征: 相同的范围,在同一个类中 函数名字相同 参数不同 virtual关键字可有可无 2.覆盖是指派生类函数覆盖基类函数,特征: 不同的范围(分别位于派生类和基类) 函数名字相同 参数相同 基类函数必须有virtual关键字 3.隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: a.如果派生类的函数与基类的函数同名,但是参数不同.此时,不论有无virtual关键字,基类的函数都将被隐藏(注意别与重载混淆) b.如果派生类的函数与基类的函数同名,并且参数也相同,但是基

C/C++知识要点3——类成员函数的重载、覆盖和隐藏的区别

1.类成员函数的重载: 重载:如果同一作用域内的几个函数名字相同但是形参列表不同,我们称之为重载. 成员函数被重载的特征: (1)相同的范围(比如在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 2.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类): (2)函数名字相同: (3)参数相同: (4)基类函数必须有virtual 关键字. 3.隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: (1)如果派生类的

【转】c++重载、覆盖、隐藏——理不清的区别

原文网址:http://blog.sina.com.cn/s/blog_492d601f0100jqqm.html 再次把林锐博士的<高质量c++编程指南>翻出来看的时候,再一次的觉得这是一本难得的好书.实践派写的东西跟理论派和翻译派写的书有着本质的 区别,每次读这本书都觉得为什么自己读了这么多遍,还是会犯一些上面讲的小错误,编代码有时候莫名其妙又会把自己转糊涂了.这本书浅显易懂,而且提到了编 程过程中应该注意的很多细节,里面展开来讲的细节又偏偏是我觉得最为薄弱的环节,如果大家想学或者正在学习