50_菱形继承

具有公共祖先 的多继承

class Animal
{
public:
    int data;
};

class Sheep:public Animal
{
public:
};
class Tuo:public Animal
{
public:
};

class SheepTuo:public Sheep,public Tuo
{
public:
};
int main(int argc, char *argv[])
{
    SheepTuo st;
    //SheepTuo 从Sheep中继承data  从Tuo继承data 就产生二义性
    //st.data = 200;//err
    //第一中方式:加作用域解决
    st.Sheep::data = 200;
    st.Tuo::data = 300;

    return 0;
}

普通继承:

class Animal
{
public:
    int data;
};

class Sheep:public Animal
{
public:
};

class Tuo:public Animal
{
public:
};

class SheepTuo:public Sheep,public Tuo
{
public:
};

 

C++菱形继承问题由编程语言允许多继承导致。以如下代码为例来说明其表现: ```cpp 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; // 主修课程 }; ``` 在这个例子中,`Assistant` 类通过 `Student` 和 `Teacher` 两条路径继承了 `Person` 类。这就导致 `Assistant` 对象中会有两份 `Person` 类的成员,从而在访问 `Person` 类成员时产生二义性问题,即编译器无法确定是通过 `Student` 路径还是 `Teacher` 路径来访问 `Person` 类的成员 [^4]。 解决 C++ 菱形继承问题的主要方法是使用虚拟继承(虚基类)。示例代码如下: ```cpp class A {}; class B: public virtual A {}; class C: public virtual A {}; class D: public B, public C {}; ``` 在这个代码中,`B` 和 `C` 类都使用 `virtual` 关键字虚继承自 `A` 类,这样 `D` 类继承 `B` 和 `C` 时,`A` 类的成员在 `D` 类中就只会存在一份,避免了成员的重复继承和访问时的二义性问题 [^2]。 另一个更完整的解决菱形继承问题示例代码如下: ```cpp #include<iostream> using namespace std; //祖先类 class R { public: R(int anInt){r=anInt;} void printOn()const{cout<<"r="<<r<<endl;} private: int r; }; //父类A class A:virtual public R { public: A(int int1,int int2):R(int2){a=int1;} private: int a;//父类A会有一份r }; //父类B class B:virtual public R { public: B(int int1,int int2):R(int2){b=int2;} private: int b;//父类B会有一份r }; //子类C直接继承祖先类R的成员,在继承两个父类 //各自扩展的成员。 class C:public A,public B { public: C(int int1,int int2,int int3,int int4) :R(int1),A(int2,int1),B(int3,int1){c=int4;} private: int c; }; int main() { R rr(10); A aa(20,30); B bb(40,50); C cc(5,7,9,10); rr.printOn(); aa.printOn(); bb.printOn(); cc.printOn(); //因为虚继承C中r和printOn函数 //直接从R类中继承,所以孙子类中只会有一份R //的成员,不会重复继承。 return 0; } ``` 在这个代码中,`A` 和 `B` 类虚继承自 `R` 类,`C` 类继承 `A` 和 `B` 类,这样 `C` 类中 `R` 类的成员就只有一份,避免了重复继承 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值