C++多态性——函数的覆盖和隐藏

 

1、函数的覆盖

覆盖的条件:

  •  基类函数必须是虚函数(使用Virtual关键字进行声明);
  •  发生覆盖的两个函数必须分别位于派生类和基类中;
  •  函数名称与参数列表必须完全一样;

2、函数的隐藏

隐藏,是指派生类中具有与基类同名的函数(不考虑参数列表是否一样),从而派生类中隐藏了基类的同名函数

隐藏的两种情况:

① 派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有使用virtual关键字。

② 派生类的函数和基类的函数同名,但参数列表不一样,在这种情况下,不管基类的函数声明是否有virtual关键字,基类的函数都将被隐藏。(注意这种情况与函数重载的区别,重载发生在同一个类中)

3、EXVC++深入详解p54

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Base
 5 {
 6 public:
 7     virtual void xfn(int i)
 8     {
 9         cout << "Base::xfn(int i)" << endl;
10     }
11 
12     void yfn(float f)
13     {
14         cout << "Base::yfn(float f)" << endl;
15     }
16 
17     void zfn()
18     {
19         cout << "Base::zfn()" << endl;
20     }
21 };
22 
23 
24 
25 class Derived :public Base
26 {
27 public:
28 
29     void xfn(int i)              //覆盖基类的xfn函数
30     {
31         cout << "Derived::xfn(int i)" << endl;
32     }
33 
34     void yfn(int c)               //隐藏基类的yfn函数
35     {
36         cout << "Derived::yfn(int c)" << endl;
37     }
38 
39     void zfn()                  //隐藏基类的zfn函数
40     {
41         cout << "Derived::zfn()" << endl;
42     }
43 };
44 
45 
46 
47 void main()
48 {
49     Derived d;
50     Base *pB = &d;
51     Derived *pD = &d;
52 
53     pB->xfn(5);
54     pD->xfn(5);
55     pB->yfn(3.14f);
56     pD->yfn(3.14f);
57     pB->zfn();
58     pD->zfn();
59 }

运行结果:

 

注意:函数的覆盖是发生在派生类和基类之间,两个函数必须完全相同,并且都是虚函数。不属于这种情况的,都是隐藏。

 

posted @ 2015-09-19 19:28  weller  阅读(2535)  评论(0编辑  收藏  举报