当前位置:   article > 正文

C++之对象模型

C++之对象模型
  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这个指针,用来指向虚函数。

内存模型:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/701101
推荐阅读
相关标签
  

闽ICP备14008679号