C++之对象模型

打印 上一主题 下一主题

主题 812|帖子 812|积分 2436

  1. #include <iostream>
  2. using namespace std;
  3. class BB
  4. {
  5. public:
  6.     virtual void vfbb()
  7.     {
  8.         cout << "BB::vfbb ..." << endl;
  9.     }
  10.     virtual void vfbb2()
  11.     {
  12.         cout << "BB::vfbb2 ..." << endl;
  13.     }
  14.     int bb_;
  15. };
  16. class B1 : virtual public BB
  17. {
  18. public:
  19.     virtual void vfb1()
  20.     {
  21.         cout << "B1::vfb1 ..." << endl;
  22.     }
  23.     int b1_;
  24. };
  25. class B2 : virtual public BB
  26. {
  27. public:
  28.     virtual void vfb2()
  29.     {
  30.         cout << "B2::vfb2 ..." << endl;
  31.     }
  32.     int b2_;
  33. };
  34. class DD : public B1, public B2
  35. {
  36. public:
  37.     virtual void vfdd()
  38.     {
  39.         cout << "DD::vfdd ..." << endl;
  40.     }
  41.     int dd_;
  42. };
  43. typedef void (*FUNC)();
  44. int main() {
  45.     cout << sizeof(BB) << endl;
  46.     cout << sizeof(B1) << endl;
  47.     cout << sizeof(DD) << endl;
  48.     BB bb;
  49.     long** p;
  50.     p = (long**)&bb;  // 根据编译器不同,有时候可以用p = reinterpret_cast<long**>(&bb);转化
  51.     FUNC fun;
  52.     fun = (FUNC)p[0][0];  // 根据编译器不同,有时候可以用reinterpret_cast<FUNC>(p[0][0]);
  53.     fun();
  54.     fun = (FUNC)p[0][1];
  55.     fun();
  56.     cout << endl;
  57.     B1 b1;
  58.     p = (long**)&b1;
  59.     fun = (FUNC)p[0][0];
  60.     fun();
  61.     fun = (FUNC)p[3][0];
  62.     fun();
  63.     fun = (FUNC)p[3][1];
  64.     fun();
  65.     cout << p[1][0] << endl;
  66.     cout << p[1][1] << endl;
  67.     cout << endl;
  68.     DD dd;
  69.     p = (long**)&dd;
  70.     fun = (FUNC)p[0][0];
  71.     fun();
  72.     fun = (FUNC)p[3][0];
  73.     fun();
  74.     fun = (FUNC)p[7][0];
  75.     fun();
  76.     fun = (FUNC)p[7][1];
  77.     fun();
  78.     cout << p[1][0] << endl;
  79.     cout << p[1][1] << endl;
  80.     cout << p[4][0] << endl;
  81.     cout << p[4][1] << endl;
  82.     cout << endl;
  83.     return 0;
  84. }
复制代码
代码输出:

总结:
虚继承,里面就会有vbptr这个指针,因为虚继承是为了解决菱形继承中变量的二义性,使派生类中只有一份基类的成员变量,所以需要这个vbptr来记录里面的两个偏移量。
虚函数,里面就会有vptr这个指针,用来指向虚函数。
内存模型:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表