WEB开发网
开发学院软件开发VC VC++深入详解:函数的覆盖和隐藏 阅读

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

 2008-11-24 19:39:06 来源:WEB开发网   
核心提示: 你看出来这段代码和例2-19所示代码的区别了吗?在这段代码中,派生类fish中的breathe函数和基类animal中的breathe函数也是完全一样的,VC++深入详解:函数的覆盖和隐藏(2),不同的是breathe函数不是虚函数,这种情况称为函数的隐藏,在Derived2类中,Base

你看出来这段代码和例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函数的覆盖。

Tags:VC 深入 详解

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接