.net 网站地图,优化大师官网下载,长沙网页制作团队,浙江同安建设有限公司网站目录
一#xff0c;菱形继承
1.1单继承
1.2多继承
1.3菱形继承
1.4菱形继承的问题
1.5虚拟继承解决数据冗余和二义性的原理
二.继承的总结和反思 一#xff0c;菱形继承
C三大特性——继承-CSDN博客
1.1单继承 单继承#xff1a;一个子类只有一个直接父类时称这个继…目录
一菱形继承
1.1单继承
1.2多继承
1.3菱形继承
1.4菱形继承的问题
1.5虚拟继承解决数据冗余和二义性的原理
二.继承的总结和反思 一菱形继承
C三大特性——继承-CSDN博客
1.1单继承 单继承一个子类只有一个直接父类时称这个继承关系为单继承 1.2多继承 多继承一个子类有两个或以上直接父类时称这个继承关系为多继承 1.3菱形继承 菱形继承菱形继承是多继承的一种特殊情况 1.4菱形继承的问题 菱形继承的问题从下面的对象成员模型构造可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。 class Person
{
public:string _name; // 姓名
};
class Student : public Person
{
protected:int _num; //学号
};
class Teacher : public Person
{
protected:int _id; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修课程
};
void Test()
{// 这样会有二义性无法明确知道访问的是哪一个Assistant a;//a._name peter; 错误// 需要显示指定访问哪个父类的成员可以解决二义性问题但是数据冗余问题无法解决a.Student::_name xxx;a.Teacher::_name yyy;
} 虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系在Student和Teacher的继承Person时使用虚拟继承即可解决问题。需要注意的是虚拟继承不要在其他地方去使用 class Person
{
public:string _name; // 姓名
};
class Student : virtual public Person
{
protected:int _num; //学号
};
class Teacher : virtual public Person
{
protected:int _id; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修课程
};
void Test()
{Assistant a;a._name peter;
}
1.5虚拟继承解决数据冗余和二义性的原理 为了研究虚拟继承原理我们给出了一个简化的菱形继承继承体系再借助内存窗口观察对象成员的模型。 class A
{
public:int _a;
};
// class B : public A
class B : virtual public A
{
public:int _b;
};
// class C : public A
class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};
int main()
{D d;d.B::_a 1;d.C::_a 2;d._b 3;d._c 4;d._d 5;return 0;
}下图是菱形继承的内存对象成员模型这里可以看到数据冗余 下图是菱形虚拟继承的内存对象成员模型这里可以分析出D对象中将A放到的了对象组成的最下面这个A同时属于B和C那么B和C如何去找到公共的A呢这里是通过了B和C的两个指针指向的一张表。这两个指针叫虚基表指针这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。 // 有人可能会有疑问为什么D中B和C部分要去找属于自己的A那么大家看看当下面的赋值发生时d是不是
要去找出B/C成员中的A才能赋值过去
D d;
B b d;
C c d;
下面是上面的Person关系菱形虚拟继承的原理解释
二.继承的总结和反思 1. 很多人说C语法复杂其实多继承就是一个体现。有了多继承就存在菱形继承有了菱形继承就有菱形虚拟继承底层实现就很复杂。所以一般不建议设计出多继承一定不要设计出菱形继承。否则在复杂度及性能上都有问题。 2. 多继承可以认为是C的缺陷之一很多后来的语言都没有多继承如Java