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) | 68 | 68 | |
sizeof(Sub1) | 136 | 152 | 差值16 |
sizeof(Sub2) | 136 | 152 | 差值16 |
sizeof(SubSub) | 272 | 232 | 差值40, |
SubSub构造顺序 | Base>Sub2>Base>Sub1>SubSub | Base>Sub2>Sub1>SubSub | |
内存分布 | 子类按照继承顺序叠加 | 这个顺序不是简单的继承顺序 | |
虚继承于多继承相比,Sub1,Sub2的头部Base数据变成4字节的值,而Base的数据在Sub1,Sub2数据之后,且两个数据之间多了4字节的cc值,类似分割符,这导致虚继承的Sub1,Sub2的数据大小比普通继承的多了16个字节。然后SubSub子类中确实只有一份Base。