门户网站开发公司平台,2二级域名免费,杭州设计 公司 网站建设,深圳网站建设公司电话复杂的菱形继承及菱形虚拟继承 复杂的菱形继承及菱形虚拟继承虚拟继承解决数据冗余和二义性的原理笔试面试题 复杂的菱形继承及菱形虚拟继承 单继承#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承#xff1a;一个子类有两个或以上直接父类时称这个继… 复杂的菱形继承及菱形虚拟继承 复杂的菱形继承及菱形虚拟继承虚拟继承解决数据冗余和二义性的原理笔试面试题 复杂的菱形继承及菱形虚拟继承 单继承一个子类只有一个直接父类时称这个继承关系为单继承 多继承一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承菱形继承是多继承的一种特殊情况。不推荐用坑 菱形继承的问题从下面的对象成员模型构造可以看出菱形继承有数据冗余和二义性的问题。在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;//会报错Assistant::_name不明确// 需要显示指定访问哪个父类的成员可以解决二义性问题但是数据冗余问题无法解决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;
}虚拟继承解决数据冗余和二义性的原理
为了研究虚拟继承原理我们给出了一个简化的菱形继承继承体系再借助内存窗口观察对象成员的模型。
#include iostream
using namespace std;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;
}不使用虚继承class C : public A 使用虚继承class C : virtual public A 笔试面试题
什么是菱形继承菱形继承的问题是什么 菱形继承是指在继承关系中存在一种特殊的结构其中一个派生类同时继承两个基类而这两个基类又共同继承同一个基类。这样形成的继承关系呈菱形因此得名菱形继承。什么是菱形虚拟继承如何解决数据冗余和二义性的 菱形虚拟继承是为了解决菱形继承中的数据冗余和函数二义性问题而引入的机制。通过使用虚拟继承(virtual)可以确保在菱形继承中共享基类的实例从而避免了数据冗余的问题。继承和组合的区别什么时候用继承什么时候用组合 继承Inheritance和组合Composition是面向对象编程中用于构建类之间关系的两种主要方式。 继承是一种is-a关系其中一个类可以继承另一个类的属性和行为。通过继承子类可以共享父类的成员变量和成员函数并且可以添加自己的特定功能。继承适用于具有层次结构的类其中子类是父类的特殊化。 组合是一种has-a关系其中一个类包含另一个类的对象作为成员变量。通过组合一个类可以使用其他类的对象来实现自己的功能而不需要继承其所有特性。组合适用于在一个类中使用其他类的功能而不需要与其形成层次结构。 当需要表示一种类与类之间的层次结构、子类是父类的特殊化关系时可以使用继承。继承可以提供代码重用和多态性的好处。当需要在一个类中使用另一个类的功能、将一个类作为另一个类的组成部分时可以使用组合。组合可以实现代码模块化和灵活性。 在选择继承或组合时需要考虑类之间的关系和需求。如果存在is-a关系且子类可以完全继承父类的属性和行为可以选择继承。如果存在has-a关系且一个类需要使用另一个类的功能可以选择组合。此外还应考虑代码的可维护性、扩展性和设计的灵活性。 本章完