设为首页 加入收藏

TOP

4.6.3 虚基类
2013-10-07 01:19:03 来源: 作者: 【 】 浏览:54
Tags:4.6.3

4.6.3  虚基类

如果一个派生类的基类是从一个共同的基类派生出来的,那么派生类的对象就是底层基类的间接派生,它会出现多个基类的拷贝。程序中如何进行分辨呢?一种方法是利用作用域运算符,即在访问基类的成员时明确指出要访问的是哪一个基类的数据成员。另一种方法是利用虚基类。虚基类是让基类只有一个拷贝,程序中的访问就不会出现访问的不确定性。虚基类在派生类中声明,其格式为:

  1. class 派生类名:virtual 继承方式 基类  
  2. {} 

虚基类的声明与普通的继承形式相同,只不过要在继承方式的前面添加关键字:virtual。当使用虚基类时,基类只有一个拷贝,程序中的访问具有确定性。

【示例4.23】 下面给出虚基类的例子。

  1. #include"iostream.h" 
  2. class base                          //类base  
  3. {  
  4.     public:  
  5.     base()  
  6.     {cout<<"基类base的构造函数"<<endl;}  
  7.     ~base()  
  8.     {cout<<"基类base的析构函数"<<endl;}  
  9. };  
  10. class A:virtual public base         //虚基类,类A在类base派生  
  11. {  
  12. public:  
  13.     A()  
  14.     {cout<<"基类A的构造函数"<<endl;}  
  15.     ~A()  
  16.     {cout<<"基类A的析构函数"<<endl;}  
  17. };  
  18. class B:virtual public base         //虚基类,类B在类base派生  
  19. {  
  20. public:  
  21.     B()  
  22.     {cout<<"基类B的构造函数"<<endl;}  
  23.     ~B()  
  24.     {cout<<"基类B的析构函数"<<endl;}  
  25. };  
  26. class C:public A,public B           //多重继承,类C继承类A和类B  
  27. {  
  28. public:  
  29.     C()  
  30.     {cout<<"派生类C的构造函数"<<endl;}  
  31.     ~C()  
  32.     {cout<<"派生类C的析构函数"<<endl;}  
  33. };  
  34. void main()  
  35. {  
  36.     C p;                            //定义对象  

程序运行结果如下:

  1. 基类base的构造函数  
  2. 基类A的构造函数  
  3. 基类B的构造函数  
  4. 派生类C的构造函数  
  5. 派生类C的析构函数  
  6. 基类B的析构函数  
  7. 基类A的析构函数  
  8. 基类base的析构函数 

这样程序对基类base只有一个拷贝,因此执行构造函数时,只要从基类base开始就可以了。如果未使用虚基类,那么程序的输出结果为:

  1. 基类base的构造函数  
  2. 基类A的构造函数  
  3. 基类base的构造函数  
  4. 基类B的构造函数  
  5. 派生类C的构造函数  
  6. 派生类C的析构函数  
  7. 基类B的析构函数  
  8. 基类base的析构函数  
  9. 基类A的析构函数  
  10. 基类base的析构函数 

此时类base有两个拷贝。当创建类C的对象时,需要逐层次的向前进行访问,出现基类base被构造两次。

警告:一个类由多个基类派生出来,则虚基类的构造函数先于非虚基类的构造函数的执行。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Visual C++老了,不得不让位 下一篇4.8.2 运算符重载

评论

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