儿子继承父亲和母亲,父母亲又继承人类,导致人类在儿子中开辟了两份重复的数据,造成空间浪费
#include <iostream>
using namespace std;
class Man
{
public:
int data;
public:
Man(int a = 0) : data(a){ cout << "构造Man" << data << endl; }
~Man() { cout << "析构Man" << data << endl; }
};
class Father:public Man
{
public:
int data;
public:
Father(int a = 0) : data(a),Man(a) { cout << "构造Father" << data << endl; }
~Father() { cout << "析构Father" << data << endl; }
};
class Mother:public Man
{
public:
int data;
public:
Mother(int a = 0) : data(a),Man(a) { cout << "构造Mother" << data << endl; }
~Mother() { cout << "析构Mother" << data << endl; }
};
class Son : public Mother, public Father
{
public:
Son(int a = 1, int b = 2, int c = 3) : Mother(b), Father(a),data(c){cout << "构造Son" << data << endl;}//无法给直接man初值,只能从能通过 Mother, Father带多个参数再给man初始化
~Son() { cout << "析构Son" << data << endl; }
public:
int data;
};
int main()
{
Son son;
son.data = 10;
son.Father::data= 20;
son.Mother::data= 30;
son.Father::Man::data =40;//‘Man’ is an ambiguous base of ‘Son’
son.Mother::Man::data =50;//这个数据存两份没有意义
cout << " Father size " << sizeof(Father) << endl;//8
cout << " Mother size " << sizeof(Mother) << endl;//8
cout << " Son size " << sizeof(Son) << endl;//20
return 0;
}
我们希望从共同父类得到的数据,内存中只存一份,需要用到虚拟继承virtual,虚拟继承
构造过程:先构造虚基类,再构造父类,再构造子类
#include <iostream>
using namespace std;
class Man
{
public:
int Xman;
public:
Man(int a = 0) : Xman(a){ cout << "构造Xman:" << Xman << endl; }
~Man() { cout << "析构Man" << Xman << endl; }
};
class Father:virtual public Man
{
public:
int data;
public:
Father(int a = 0) : data(a),Man(a) { cout << "构造Father" << data << endl; }
~Father() { cout << "析构Father" << data << endl; }
};
class Mother:virtual public Man
{
public:
int data;
public:
Mother(int a = 0) : data(a),Man(a) { cout << "构造Mother" << data << endl; }
~Mother() { cout << "析构Mother" << data << endl; }
};
class Son : public Mother, public Father
{
public:
Son(int a = 1, int b = 2, int c = 3) : Man(10086),Father(a),Mother(b),data(c){cout << "构造Son" << data << endl;}
~Son() { cout << "析构Son" << data << endl; }
public:
int data;
};
int main()
{
Son son;
son.data = 10;
son.Father::data= 20;
son.Mother::data= 30;
cout<<"son.Xman:"<<son.Xman<<endl;
son.Xman = 200;//vitual 虚拟继承,共同父类,只存了一份父类数据
cout<<"son.Father::Man::Xman:"<<son.Father::Man::Xman<<endl;
cout<<"son.Mother::Man::Xman:"<<son.Mother::Man::Xman<<endl;
cout << " Father size " << sizeof(Man) << endl;//16为什么是16
cout << " Father size " << sizeof(Father) << endl;//16
cout << " Mother size " << sizeof(Mother) << endl;//16
cout << " Son size " << sizeof(Son) << endl;//40
return 0;
}