设为首页 加入收藏

TOP

VC++深入详解:函数的覆盖和隐藏
2014-10-24 16:30:04 来源: 作者: 【 】 浏览:59
Tags:深入 详解 函数 覆盖 隐藏

  1.函数的覆盖


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


  例2-19


  class animal


  {


  public:


  …


  virtual void breathe()


  {


  cout<<"animal breathe"<


  }


  };


  class fish:public animal


  {


  public:


  void breathe()


  {


  cout<<"fish bubble"<


  }


  };


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


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


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


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


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


  2.函数的隐藏


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


  例2-20


  class animal


  {


  public:


  …


  void breathe()


  {


  cout<<"animal breathe"<


  }


  };


  class fish:public animal


  {


  public:


  void breathe()


  {


  cout<<"fish bubble"<


  }


  };


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


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


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


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


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


  例2-21


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++类的设计习惯及头文件重复包含.. 下一篇VC++深入详解:纯虚函数

评论

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