


#include <iostream>
#include <string>
using namespace std;
//菱形继承
class Animal {
public:
int age;
};
class Sheep : public Animal {
};
class Tuo : public Animal {
};
class SheepTuo : public Sheep, public Tuo {
};
void test() {
SheepTuo st;
st.age = 18;//这里报错如下
}
int main() {
test();
return 0;
}

#include <iostream>
#include <string>
using namespace std;
//菱形继承
class Animal {
public:
int age;
};
//利用虚继承 解决菱形继承问题
//继承之前 加上关键字 virtual 变为虚继承
class Sheep : virtual public Animal {
};
class Tuo : virtual public Animal {
};
class SheepTuo : public Sheep, public Tuo {
};
void test() {
SheepTuo st;
// st.age=18;//会报错
//当菱形继承时,两个父类拥有相同的数据,需要加以作用域区分
//这份数据我们知道 只有一份数据就可以,菱形继承导致数据有两份,资源浪费
//利用虚继承解决
st.Sheep::age = 18;
st.Tuo::age = 20;
//没有虚继承之前,输出结果18和20 ,虚继承后输出都是20,而且虚继承后,st.age不会报错
cout << "st.Sheep::age=" << st.Sheep::age << endl;
cout << "st.Tuo::age=" << st.Tuo::age << endl;
//虚继承后,st.age不会报错
cout << "st.age=" << st.age << endl;
}
int main() {
test();
return 0;
}



本文探讨了C++中菱形继承导致的问题及其解决方案。通过使用虚继承,可以有效避免基类的多重实例化,确保单一继承路径,并展示了如何正确访问基类成员。
431

被折叠的 条评论
为什么被折叠?



