重载.覆盖.隐藏

谁说胖子不能爱 提交于 2019-12-18 04:38:50

a.成员函数被重载overload的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖override(重写)是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

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

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

 

它们之间最为重要的区别就是:
覆盖的函数是多态的,是存在于vtbl之中的函数才能构成"覆盖"的关系,而隐藏的函数都是一般的函数,不支持多态,在编译阶段就已经确定下来了.

 

也可参考:

重载和重写的区别:

 

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

 

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

 

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

 

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

 

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

 

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

 

练习: 1 #include <stdlib.h> 2 #include <stdio.h>

 3 #include <string>
 4 #include <string.h>
 5 #include <iostream>
 6 #include <vector>
 7 #include <stack>
 8 using namespace std;
 9 class Base
10 {
11 public:
12 virtual void f( float x) {cout << " Base::f(folat) " << x << endl;}
13 void g( float x) {cout << " Base::g(float) " << x << endl;}
14 };
15 
16 class Derived: public Base
17 {
18 public:
19 virtual void f( float x) {cout << " Derived::f(float) " << x << endl;}   virtual void f(int x) {cout << " Derived::f(int) " << x << endl;}  void g(float x) {cout << " Deriver::g(float) " << x << endl;}
20 void g( int x) {cout << " Deriver::g(int) " << x << endl;}
21 };
22 
23 int main()
24 {
25 Derived d;
26 Base *pb =&d;
27 Derived *pd =&d;
28 pb->f( 3.14f );//Derived::f(float) 3.14 覆盖override
29 pd->f( 3.15f ); //Derived::f(float) 3.15 Derived类成员函数重载overload
30 pb->g( 3.16f ); // 输出结果:Base::g(float)3.16 
31 pd->g( 3.17f ); // 输出结果:Dervied::g(float)3.17  Derived 类的成员函数g重载
32 return 0 ;
33 }

 

Derived
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!