1、函数的覆盖
覆盖的条件:
- 基类函数必须是虚函数(使用Virtual关键字进行声明);
- 发生覆盖的两个函数必须分别位于派生类和基类中;
- 函数名称与参数列表必须完全一样;
2、函数的隐藏
隐藏,是指派生类中具有与基类同名的函数(不考虑参数列表是否一样),从而派生类中隐藏了基类的同名函数。
隐藏的两种情况:
① 派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有使用virtual关键字。
② 派生类的函数和基类的函数同名,但参数列表不一样,在这种情况下,不管基类的函数声明是否有virtual关键字,基类的函数都将被隐藏。(注意这种情况与函数重载的区别,重载发生在同一个类中)
3、EX(VC++深入详解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 }
运行结果:
注意:函数的覆盖是发生在派生类和基类之间,两个函数必须完全相同,并且都是虚函数。不属于这种情况的,都是隐藏。