标签:clu 允许 oid pre 基类 virtual sizeof end 需要
class 子类 : 继承方式 父类1,继承方式 父类2...
#include <iostream>
using namespace std;
class Base1
{
public :
Base1()
{
m_a = 100;
}
int m_a;
};
class Base2
{
public :
Base2()
{
m_a = 100;
}
int m_a;
};
//子类继承Base1和Base2
class Son : public Base1 , public Base2
{
public :
Son()
{
m_c = 300;
m_d = 400;
}
int m_c;
int m_d;
};
void test01()
{
Son s;
cout << "sizeof Son =" << sizeof (s) <<endl;
// 当父类中出现同名成员,加作用域
cout << "Base1 :: m_a " << s.Base1::m_a << endl;
cout << "Base2 :: m_a " << s.Base2::m_a << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
概念:
我们来看一个小案例:假设有羊、驼、和羊驼三个动物,羊继承动物的数据,驼同样继承了动物的数据,当羊驼使用数据时,会产生二义性
菱形继承的问题:羊驼继承了两份动物数据,但这份数据我们只需要一份就可以了
可以利用虚继承来解决菱形继承的问题
#include <iostream>
using namespace std;
class Animal
{
public:
int m_age;
};
//羊类
class Sheep: virtual public Animal
{};
//驼类
class Tuo: virtual public Animal
{};
//羊驼类
class SheepTuo: public Sheep,public Tuo
{};
void test01()
{
SheepTuo st;
st.Sheep::m_age = 18;
st.Tuo::m_age = 28;
//当出现菱形继承的时候,两个父类拥有相同的数据,需要加以作用域区分
// 这份数据我们只需要一份,菱形继承导致数据有两份,造成资源浪费 ————> 利用虚继承解决菱形继承的问题
cout << "st.Sheep :: m_age ="<< st.Sheep::m_age<< endl;
cout << "st.Tuo0 :: m_age ="<< st.Tuo::m_age<< endl;
cout << "st.m_age = " << st.m_age << endl; // 发生虚继承后数据只有一个
}
int main()
{
test01();
system("pause");
return 0;
}
virtual
变为虚继承标签:clu 允许 oid pre 基类 virtual sizeof end 需要
原文地址:https://www.cnblogs.com/BY1314/p/13038298.html