-
单继承:(一个子类只有一直接个父类)
#include <iostream> using namespace std; class A { public: int _a; }; class B : public A { protected: int _b; }; class C : public A { protected: int _c; }; class D : public B, public C { protected: int _d; }; void test() { cout<<sizeof(D)<<endl; } int main() { test(); return 0; }
输出结果为:20
- [菱形继承的对象模型]
D的对象中有两个A成员
(菱形继承存在二义性和数据冗余性的问题)
-
虚继承:在继承关系前加上关键字virtual
(解决菱形继承的二义性和数据冗余的问题)
- 虚继承解决了在菱形继承体系里面子类对象包含多份父类对象的数据冗余&浪费空间问题。(比如 D的对象中有两个A成员)
- 虚继承看起来很复杂,在实际应用中通常我们不会去用它。因为它在解决数据冗余的同时又带来了性能上的消耗。
class A { public: int _a; }; class B :virtual public A { protected: int _b; }; class C :virtual public A { protected: int _c; }; class D : public B, public C { protected: int _d; }; void test() { cout<<sizeof(D)<<endl; }
输出结果为:24
- [菱形虚拟继承的对象模型]