• 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。

  • 相关阅读:
    【静态代码扫描服务】python实现-附ChatGPT解析
    Python基础学习(11)常用模块
    【软件测试及质量保证】小结
    layui实现鼠标移入/移出时显示/隐藏tips
    电脑小Tip---外接键盘F1-F12快捷键与笔记本不同步
    【GWO-KELM预测】基于灰狼算法优化核极限学习机回归预测研究(matlab代码实现)
    【设计模式】封装、继承、抽象、多态
    【语音增强】多维谱自适应小波语音信号去噪【含Matlab源码 1972期】
    年轻一代程序员:社牛、不卷、玩开源
    怎么从零开始运行github / 现成的项目
  • 原文地址:https://blog.csdn.net/wasaiheihei/article/details/127410339