Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155594
  • 博文数量: 44
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-10 13:28
个人简介

仰望星空

文章分类
文章存档

2016年(22)

2015年(22)

我的朋友

分类: C/C++

2016-04-10 22:19:54

虚基类:当一个基类被声明为虚基类后,即使它成为了多继承链路上的公共基类,最后的派生类中也只有它的一个备份。

虚基类的特点:

       虚基类构造函数的参数必须由最新派生出来的类负责初始化(即使不是直接继承);
       虚基类的构造函数先于非虚基类的构造函数执行。

  1. #include <iostream>
  2. using namespace std;
  3. // 虚基类的构造函数在非虚基类的构造函数之前调用
  4. // 虚基类的作用是表明这个类是公共继承的,且只有一份
  5. class A
  6. {
  7. protected:
  8.    int a;
  9. public:
  10.    A():a(50){cout<<"A 缺省构造函数: a="<<a<<endl;}
  11.    A(int i):a(i){cout<<"A 构造函数: a="<<a<<endl;}
  12.    ~A(){cout<<"A 析构函数:a="<<a<<endl;}
  13. };
  14.  
  15. class B1:virtual public A
  16. {
  17. protected:
  18.    int b1;
  19. public:
  20.    B1():b1(60){cout<<"B1 缺省构造函数: b1="<<b1<<endl;}
  21.    B1(int i, int j):A(i),b1(j){cout<<"B1 构造函数: b1="<<b1<<endl;}
  22.    ~B1(){cout<<"B1 析构函数:b1="<<b1<<endl;}
  23. };
  24.  
  25. class B2:virtual public A
  26. {
  27. protected:
  28.    int b2;
  29. public:
  30.    B2():b2(70){cout<<"B2 缺省构造函数: b2="<<b2<<endl;}
  31.    B2(int i, int j):A(i),b2(j){cout<<"B2 构造函数: b2="<<b2<<endl;}
  32.    ~B2(){cout<<"B2 析构函数:b2="<<b2<<endl;}
  33. };
  34.  
  35. class C:virtual public B1, virtual public B2
  36. {
  37. protected:
  38.    int c;
  39. public:
  40.    C():c(70){cout<<"C 缺省构造函数: c="<<c<<endl;}
  41.    C(int i, int j,int x, int y):A(i),B1(i,j),B2(i,x),c(y){cout<<"C 构造函数: c="<<c<<endl;}
  42.    ~C(){cout<<"C 析构函数:c="<<c<<endl;}
  43. };
  44.  
  45. int main()
  46. {
  47.    C obj1;
  48.    C obj2(6,7,8,9); 
  49.  
  50.    return 0;
  51. }

阅读(2632) | 评论(0) | 转发(0) |
0

上一篇:21、虚基类

下一篇:23、常类型

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