探究C++中的菱形继承
来源:互联网 发布:国产007经典视频知乎 编辑:程序博客网 时间:2024/05/16 09:01
菱形继承
class Person{int _AA;};class Student:public Person{int _BB;};class Teacher :public Person{int _CC;};class Assistant :public Student, public Teacher{int _DD;};
PS:
Assistant的对象中存在两份Person成员
菱形继承存在二义性和数据冗余
解决:
使用虚继承
首先不使用虚继承时:
#include<iostream>using namespace std;class AA{public:string _aa;};class BB :public AA{public:int _bb;};class CC :public AA{public:int _cc;};class DD :public BB, public CC{public:int _dd;};int main(){DD d;d.BB::_aa = 1;d.CC::_aa = 2;d._bb = 3;d._cc = 4;d._dd = 5;cout << sizeof(d) << endl;return 0;}
菱形继承对象模型:
使用虚继承时:
#include<iostream>using namespace std;class AA{public:string _aa;};class BB :virtual public AA{public:int _bb;};class CC :virtual public AA{public:int _cc;};class DD :public BB, public CC{public:int _dd;};int main(){DD d;d.BB::_aa = 1;d.CC::_aa = 2;d._bb = 3;d._cc = 4;d._dd = 5;cout << sizeof(d) << endl;return 0;}
菱形虚拟继承对象模型:
两个空格处地址相差为8,第一个空格处存放空格处位置到AA的偏移量为20,第二个空格处存放空格处位置到AA的偏移量为12,浪费两个空间存放偏移量,AA只需计算一次。
PS:
1.虚继承解决了在菱形继承体系里面子类对象包含多份父类对象的数据冗余&浪费空间的问题。
2.虚继承体系看起来好复杂,在实际应用我们通常不会定义如此复杂的继承体系。一般不到万不得已都不要定义菱形结构的虚继承体系结构,因为使用虚继承解决数据冗余问题也带来了性能上的损耗。
1 0
- 探究C++中的菱形继承
- 探究菱形继承对象模型
- C++中的 菱形继承
- 【C++】菱形继承
- 【c++】菱形继承
- 【c++】菱形继承
- 菱形继承中的虚继承
- 【C++】继承(菱形继承)
- <c++>继承及菱形继承
- 【C++】菱形继承与虚拟菱形继承的对比分析
- C++:菱形继承和虚拟继承
- C++ — 关于菱形虚拟继承对象模型的探究
- C++中的多态、单继承、多继承、菱形继承、菱形虚拟继承
- C++继承和菱形继承中的虚继承
- (C++)继承、菱形继承和虚继承的那些事儿
- C++中的【菱形虚继承】深入剖析
- C++中的【菱形虚继承】深入剖析
- C++中的【菱形虚继承】深入剖析
- Bricks —— 判断矩形能否嵌套
- hihocoder #1043 完全背包
- vi/vim 的使用
- JVM -XX: 参数介绍
- java虚拟机的基本结构
- 探究C++中的菱形继承
- 数据库连接池简单理解
- 工厂设计模式
- 这些绕来绕去的题目……
- qt 5.0中HeaderView的setResiziMode无法使用的问题
- hdu5512pagodas(最小公因数)
- time和datetime模块
- lleetcode oj java 516. Longest Palindromic Subsequence
- 笔试题14