• C++虚继承和普通继承实现测试对比记录


    1.重复继承的普通继承和虚继承实现代码

    1.1普通重复继承测试代码实现:

    1. //普通的重复继承实现栗子:
    2. class Base
    3. {
    4. public:
    5. Base(): m_a(1), m_b("Base"){ cout << "Base()" << endl; };
    6. ~Base() {};
    7. private:
    8. int m_a;
    9. char m_b[64];
    10. };
    11. class Sub1: public Base
    12. {
    13. public:
    14. Sub1() : m_a1(101), m_b1("Sub1") { cout << "Sub1()" << endl; };
    15. ~Sub1() {};
    16. private:
    17. int m_a1;
    18. char m_b1[64];
    19. };
    20. class Sub2 : public Base
    21. {
    22. public:
    23. Sub2() : m_a2(102), m_b2("Sub2") { cout << "Sub2()" << endl; };
    24. ~Sub2() {};
    25. private:
    26. int m_a2;
    27. char m_b2[64];
    28. };
    29. class SubSub : public Sub2, public Sub1
    30. {
    31. public:
    32. SubSub() { cout << "Sub2()" << endl; };
    33. ~SubSub() {};
    34. };
    35. void Func_virtualSubClass()
    36. {
    37. std::cout << "Func_virtualSubClass()!\n";
    38. Base base;
    39. std::cout << &base << "; size:" << sizeof(base) << endl;
    40. Sub1 sub1;
    41. std::cout << &sub1 << "; size:" << sizeof(sub1) << endl;
    42. Sub2 sub2;
    43. std::cout << &sub2 << "; size:" << sizeof(sub2) << endl;
    44. SubSub subSub;
    45. std::cout << &subSub << "; size:" << sizeof(subSub) << endl;
    46. }

    1.2.虚继承测试代码实现:

    1. //虚继承重复继承实现栗子
    2. class Base
    3. {
    4. public:
    5. Base(): m_a(1), m_b("Base"){ cout << "Base()" << endl; };
    6. ~Base() {};
    7. private:
    8. int m_a;
    9. char m_b[64];
    10. };
    11. class Sub1: public virtual Base
    12. {
    13. public:
    14. Sub1() : m_a1(101), m_b1("Sub1") { cout << "Sub1()" << endl; };
    15. ~Sub1() {};
    16. private:
    17. int m_a1;
    18. char m_b1[64];
    19. };
    20. class Sub2 : public virtual Base
    21. {
    22. public:
    23. Sub2() : m_a2(102), m_b2("Sub2") { cout << "Sub2()" << endl; };
    24. ~Sub2() {};
    25. private:
    26. int m_a2;
    27. char m_b2[64];
    28. };
    29. class SubSub : public Sub2, public Sub1
    30. {
    31. public:
    32. SubSub() { cout << "Sub2()" << endl; };
    33. ~SubSub() {};
    34. };
    35. void Func_virtualSubClass()
    36. {
    37. std::cout << "Func_virtualSubClass()!\n";
    38. Base base;
    39. std::cout << &base << "; size:" << sizeof(base) << endl;
    40. Sub1 sub1;
    41. std::cout << &sub1 << "; size:" << sizeof(sub1) << endl;
    42. Sub2 sub2;
    43. std::cout << &sub2 << "; size:" << sizeof(sub2) << endl;
    44. SubSub subSub;
    45. std::cout << &subSub << "; size:" << sizeof(subSub) << endl;
    46. }

    2.重复继承的测试结果:

    2.1.普通继承的重复继承代码运行结果:

     

    2.2.虚继承的重复继承代码运行结果:

     3.测试结果数据对比总结:

    非虚继承虚继承比较说明
    sizeof(Base)6868
    sizeof(Sub1)136152差值16
    sizeof(Sub2)136152差值16
    sizeof(SubSub)272232差值40,
    SubSub构造顺序Base>Sub2>Base>Sub1>SubSubBase>Sub2>Sub1>SubSub
    内存分布子类按照继承顺序叠加这个顺序不是简单的继承顺序

     虚继承于多继承相比,Sub1,Sub2的头部Base数据变成4字节的值,而Base的数据在Sub1,Sub2数据之后,且两个数据之间多了4字节的cc值,类似分割符,这导致虚继承的Sub1,Sub2的数据大小比普通继承的多了16个字节。然后SubSub子类中确实只有一份Base。

  • 相关阅读:
    多伦多 Pwn2Own 大赛首日战报!三星 Galaxy S23 被黑两次
    第四篇章:运行时数据区——共享空间
    【Effective Python】读书笔记-06元类与属性
    算法设计与分析 SCAU8595 钱币组合的问题(优先做)
    Java:泛型
    MachineLearning 11. 机器学习之随机森林生存分析(randomForestSRC)
    FreeRTOS学习笔记-信号量
    18亿欧元大动作,法国瞄准实现量子飞跃
    idea安装
    Kotlin与Java写法的变更
  • 原文地址:https://blog.csdn.net/wasaiheihei/article/details/127410339