设为首页 加入收藏

TOP

2.2.8 函数的覆盖和隐藏(1)
2013-10-07 15:21:48 来源: 作者: 【 】 浏览:62
Tags:2.2.8 函数 覆盖 隐藏

2.2.8  函数的覆盖和隐藏(1)

1.函数的覆盖

在上一节介绍多态性的时候,我们给出了下面的代码片段:

例2-19

  1. class animal  
  2. {  
  3. public:  
  4.         …  
  5.     virtual void breathe()  
  6.     {  
  7.         cout<<"animal breathe"<<endl;  
  8.     }  
  9. };  
  10. class fish:public animal  
  11. {  
  12. public:  
  13.     void breathe()  
  14.     {  
  15.         cout<<"fish bubble"<<endl;  
  16.     }  
  17. };  

在基类animal的breathe函数前添加了virtual关键字,声明该函数为虚函数。在派生类fish中重写了breathe函数,我们注意到,fish类的breathe函数和animal类的breathe函数完全一样,无论函数名,还是参数列表都是一样的,这称为函数的覆盖(override)。构成函数覆盖的条件为:

基类函数必须是虚函数(使用virtual关键字进行声明)。

发生覆盖的两个函数要分别位于派生类和基类中。

函数名称与参数列表必须完全相同。

由于C++(www.cppentry.com)的多态性是通过虚函数来实现的,所以函数的覆盖总是和多态关联在一起。在函数覆盖的情况下,编译器会在运行时根据对象的实际类型来确定要调用的函数。

2.函数的隐藏

我们再看例2-20的代码:

例2-20

  1. class animal  
  2. {  
  3. public:  
  4.         …  
  5.     void breathe()  
  6.     {  
  7.         cout<<"animal breathe"<<endl;  
  8.     }  
  9. };  
  10. class fish:public animal  
  11. {  
  12. public:  
  13.     void breathe()  
  14.     {  
  15.         cout<<"fish bubble"<<endl;  
  16.     }  
  17. };  

你看出来这段代码和例2-19所示代码的区别了吗?在这段代码中,派生类fish中的breathe函数和基类animal中的breathe函数也是完全一样的,不同的是breathe函数不是虚函数,这种情况称为函数的隐藏。所谓隐藏,是指派生类中具有与基类同名的函数(不考虑参数列表是否相同),从而在派生类中隐藏了基类的同名函数。

初学者很容易把函数的隐藏与函数的覆盖、重载相混淆,我们看下面两种函数隐藏的情况:

(1)派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有使用virtual关键字。此时基类的函数将被隐藏,而不是覆盖(请参照上文讲述的函数覆盖进行比较)。

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

下面我们给出一个例子,以帮助读者更好地理解函数的覆盖和隐藏,代码如例2-21所示。

例2-21

  1. class Base  
  2. {  
  3. public:  
  4.       virtual void fn();  
  5. };  
  6. class Derived : public Base  
  7. {  
  8. public:  
  9.       void fn(int);  
  10. };  
  11.  
  12. class Derived2 : public Derived  
  13. {  
  14. public:  
  15.       void fn();  
  16. };  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.4.4 基于协同性阻塞的交叉调度 下一篇2.2.11 VC++程序编译链接的原理与..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

Shell 基本运算符 -
Shell 函数 | 菜鸟教
Linux 常用命令集合
socket 编程如何实现
Python创建简易的Soc