- //普通的重复继承实现栗子:
- 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;
- }
- //虚继承重复继承实现栗子
- 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;
- }




| 非虚继承 | 虚继承 | 比较说明 | |
| 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。