C++对象模型----重复继承

Code:
  1. #include <iostream>   
  2. using namespace std;   
  3. class A   
  4. {   
  5. public:   
  6.    A(int a):x(a){}   
  7.    virtual void f(){cout << "A::f() called." << endl;}   
  8.    virtual void g(){cout << "A::g() called." << endl;}   
  9.    virtual void h(){cout << "A::h() called." << endl;}   
  10. private:   
  11.     int x;   
  12. };   
  13. class B:public A   
  14. {   
  15. public:   
  16.     B(int a,int b):A(a),y(b){}   
  17.    void f(){cout << "B::f() called." << endl;}   
  18.    virtual void m(){cout << "B::m() called." << endl;}   
  19.    virtual void n(){cout << "B::n() called." << endl;}   
  20. private:   
  21.     int y;   
  22. };   
  23. class C:public A   
  24. {   
  25. public:   
  26.     C(int a,int c):A(a),z(c){}   
  27.    void g(){cout << "C::g() called." << endl;}   
  28.    virtual void cfun(){cout << "C::cfun() called." << endl;}   
  29. private:   
  30.     int z;   
  31. };   
  32. class D:public B,public C   
  33. {   
  34. public:   
  35.     D(int a,int b,int c,int d):B(a,b),C(a,c),d(d){}   
  36.     void h(){cout << "D::h() called." << endl;}   
  37.     void m(){cout << "D::m() called." << endl;}   
  38.     virtual void t(){cout << "D::t() called." << endl;}   
  39. private:   
  40.     int d;   
  41. };   
  42. int main()   
  43. {   
  44.     D tp(2,3,4,5);   
  45.     typedef void (*PFUN)(void);   
  46.     PFUN pfun;   
  47.     pfun = (PFUN)(*((int*)(*(int*)(&tp))));   
  48.     pfun();   
  49.     pfun = (PFUN)(*((int*)(*(int*)(&tp))+1));   
  50.     pfun();   
  51.     pfun = (PFUN)(*((int*)(*(int*)(&tp))+2));   
  52.     pfun();   
  53.     pfun = (PFUN)(*((int*)(*(int*)(&tp))+3));   
  54.     pfun();   
  55.     pfun = (PFUN)(*((int*)(*(int*)(&tp))+4));   
  56.     pfun();   
  57.     pfun = (PFUN)(*((int*)(*(int*)(&tp))+5));   
  58.     pfun();   
  59.     cout << *((int*)(&tp) + 1) << endl;   
  60.     cout << *((int*)(&tp) + 2) << endl;   
  61.     pfun =  (PFUN)(*(int*)(*((int*)(&tp) + 3)));   
  62.     pfun();   
  63.     pfun =  (PFUN)(*((int*)(*((int*)(&tp) + 3))+1));   
  64.     pfun();   
  65.     pfun =  (PFUN)(*((int*)(*((int*)(&tp) + 3))+2));   
  66.     pfun();   
  67.     pfun =  (PFUN)(*((int*)(*((int*)(&tp) + 3))+3));   
  68.     pfun();   
  69.     cout << *((int*)(&tp) + 4) << endl;   
  70.     cout << *((int*)(&tp) + 5) << endl;   
  71.     cout << *((int*)(&tp) + 6) << endl;   
  72.     return 0;   
  73. }   

对像模型:

 

------------------------------------------------------------------------------------

从输出结果上我们可以看到A::x在对象D中有两份。一份来自于B,一份来自于C。这不仅浪费的存储空间,而且容易造成歧义。故此引入了虚拟继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值