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

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

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

//普通的重复继承实现栗子:
class Base
{
public:
    Base(): m_a(1), m_b("Base"){ cout << "Base()" << endl; };
    ~Base() {};

private:
    int m_a;
    char m_b[64];
};

class Sub1: public Base
{
public:
    Sub1() : m_a1(101), m_b1("Sub1") { cout << "Sub1()" << endl; };
    ~Sub1() {};

private:
    int m_a1;
    char m_b1[64];
};

class Sub2 : public Base
{
public:
    Sub2() : m_a2(102), m_b2("Sub2") { cout << "Sub2()" << endl; };
    ~Sub2() {};

private:
    int m_a2;
    char m_b2[64];
};

class SubSub : public Sub2, public Sub1
{
public:
    SubSub() { cout << "Sub2()" << endl; };
    ~SubSub() {};
};

void Func_virtualSubClass()
{
    std::cout << "Func_virtualSubClass()!\n";
    Base base;
    std::cout << &base << "; size:" << sizeof(base) << endl;
    Sub1 sub1;
    std::cout << &sub1 << "; size:" << sizeof(sub1) << endl;
    Sub2 sub2;
    std::cout << &sub2 << "; size:" << sizeof(sub2) << endl;
    SubSub subSub;
    std::cout << &subSub << "; size:" << sizeof(subSub) << endl;
}

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

//虚继承重复继承实现栗子
class Base
{
public:
    Base(): m_a(1), m_b("Base"){ cout << "Base()" << endl; };
    ~Base() {};

private:
    int m_a;
    char m_b[64];
};

class Sub1: public virtual Base
{
public:
    Sub1() : m_a1(101), m_b1("Sub1") { cout << "Sub1()" << endl; };
    ~Sub1() {};

private:
    int m_a1;
    char m_b1[64];
};

class Sub2 : public virtual Base
{
public:
    Sub2() : m_a2(102), m_b2("Sub2") { cout << "Sub2()" << endl; };
    ~Sub2() {};

private:
    int m_a2;
    char m_b2[64];
};

class SubSub : public Sub2, public Sub1
{
public:
    SubSub() { cout << "Sub2()" << endl; };
    ~SubSub() {};
};

void Func_virtualSubClass()
{
    std::cout << "Func_virtualSubClass()!\n";
    Base base;
    std::cout << &base << "; size:" << sizeof(base) << endl;
    Sub1 sub1;
    std::cout << &sub1 << "; size:" << sizeof(sub1) << endl;
    Sub2 sub2;
    std::cout << &sub2 << "; size:" << sizeof(sub2) << endl;
    SubSub subSub;
    std::cout << &subSub << "; size:" << sizeof(subSub) << endl;
}

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值