Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106463
  • 博文数量: 40
  • 博客积分: 1650
  • 博客等级: 上尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-20 13:05
文章分类
文章存档

2011年(1)

2009年(1)

2008年(1)

2007年(37)

我的朋友

分类: C/C++

2007-07-25 10:31:08

察看一个简单实例:
#include
#include
using namespace std;

class Base
{
  public:
      Base(int num)
    {
    cout<<"base!"<    }
};
class Derive1:virtual public Base
{
  public:
      Derive1 (int num, int num1):Base (num)
    {
    cout<<"Derive1!"<    }
};
class Derive2:virtual public Base
{
  public:
    int num2;
  public:
      Derive2 (int num, int num2):Base (num)
    {
    cout<<"Derive2!"<    }
};

class Derive3:public Derive1, public Derive2
{
  public:
    int num3;
  public:
      Derive3 (int num, int num1, int num2, int num3):Base (num),
    Derive1 (num1, num), Derive2 (num2, num)
    {
    cout<<"Derive3!"<    }
};

int
main ()
{
    Derive3 object (10, 20, 30, 40);
    return 0;
}

运行结果:
base!
Derive1!
Derive2!
Derive3!

    在上例中,由类Base,类Derive1和类Derive2以及类Derive3组成了类继承的层次结构。类Derive3的对象将包含两个Base类的子对象。由于Base类是派生类Derive3的一个公共基类,通过使用虚基类使这个公共基类Base在派生类Derive3中只产生一个基类子对象,否则这个公共基类将可能会在派生类的对象中产生多个基类子对象。

   虚基类的引入和说明

    为了解决二义性问题,引进虚基类虚,基类说明格式如下:

    virtual <继承方式><基类名>

    其中,virtual是虚类的关键字。虚基类的说明是用在定义派生类时,写在派生类名的后面。

    对于虚基类来讲,由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。由于继承结构的层次可能很深,规定将在建立对象时所指定的类称为最派生类。C++规定,虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。如果一个派生类有一个直接或间接的虚基类,那么派生类的构造函数的成员初始列表中必须列出对虚基类构造函数的调用。如果未被列出,则表示使用该虚基类的缺省构造函数来初始化派生类对象中的虚基类子对象。

   从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数 的调用。但是,只有用于建立对象的那个最派生类的构造函数调用虚基类的构造函数,而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略,这样便保证了对虚基类的对象只初始化一次。

  在一个成员初始化列表中出现对虚基类和非虚基类构造函数的调用,则虚基类的构造函数先于非虚基类的构造函数的执行。
阅读(763) | 评论(0) | 转发(0) |
0

上一篇:虚函数剖析

下一篇:lilo和grub(转)

给主人留下些什么吧!~~