龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++深入详解:函数的覆盖和隐藏(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
你看出来这段代码和例2-19所示代码的区别了吗?在这段代码中,派生类fish中的breathe函数和基类animal中的breathe函数也是完全一样的,不同的是breathe函数不

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

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

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

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

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

  例2-21

  class Base
  {
  public:
    virtual void fn();
  };
  class Derived : public Base
  {
  public:
    void fn(int);
  };
  class Derived2 : public Derived
  {
  public:
    void fn();
  };

  在这个例子中,Derived类的fn(int)函数隐藏了Base类的fn()函数,Derived类fn(int)函数不是虚函数(注意和覆盖相区别)。Derived2类的fn()函数隐藏了Derived类的fn(int)函数,由于Derived2类的fn()函数与Base类的fn()函数具有同样的函数名和参数列表,因此Derived2类的fn()函数是一个虚函数,覆盖了Base类的fn()函数。注意,在Derived2类中,Base类的fn()函数是不可见的,但这并影响fn函数的覆盖。

精彩图集

赞助商链接