C++虚继承
我们在解决实际问题的时候,多继承和多重继承可能出现下面的情况
这样就使得D中拥有两组A中一模一样的数据,这是不被允许的,为了解决这种情况,我们引入了虚继承
当没有虚继承的时候
#include<iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(string color="pink")
{
m_strColor=color;
cout<<"Person()"<<endl;
}
virtual ~Person()
{
cout<<"~Person()"<<endl;
}
void printColor()
{
cout<< m_strColor <<endl;
cout<<"Person--printColor"<<endl;
}
protected:
string m_strColor;
};
class Worker : public Person
{
public:
Worker(string code="001",string color="pink"):Person("Worker"+color)
{
m_strCode=code;
cout<<"Worker()"<<endl;
}
virtual ~Worker()
{
cout<<"~Worker()"<<endl;
}
void carry()
{
cout<<m_strCode<<endl;
cout<<"Worker--carry"<<endl;
}
protected:
string m_strCode;
};
class Farmer: public Person
{
public:
Farmer(string name="jack",string color="pink"):Person("Farmer"+color)
{
m_strName=name;
cout<<"Farmer()"<<endl;
}
virtual ~Farmer()
{
cout<<"~Farmer()"<<endl;
}
void sow()
{
cout<<m_strName<<endl;
cout<<"Farmer--sow"<<endl;
}
protected:
string m_strName;
};
class MigrantWorker : public Worker,public Farmer
{
public:
MigrantWorker(string name,string code,string color):Farmer(name,color),Worker (code,color)
{
cout<<"MigrantWorker()"<<endl;
}
virtual ~MigrantWorker()
{
cout<<"~MigrantWorker()"<<endl;
}
};
int main(void)
{
MigrantWorker *p=new MigrantWorker("Merry","200","yellow");
p->Farmer::printColor();
p->Worker::printColor();
delete p;
p=NULL;
system("pause");
return 0;
}
我们看到有两个m_strName的数据,一个是Farmeryellow,另一个是Workeryellow,这样是不被允许的
当引入虚继承
#include<iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(string color="pink")
{
m_strColor=color;
cout<<"Person()"<<endl;
}
virtual ~Person()
{
cout<<"~Person()"<<endl;
}
void printColor()
{
cout<< m_strColor <<endl;
cout<<"Person--printColor"<<endl;
}
protected:
string m_strColor;
};
class Worker : virtual public Person//public virtual Person
{
public:
Worker(string code="001",string color="pink"):Person("Worker"+color)
{
m_strCode=code;
cout<<"Worker()"<<endl;
}
virtual ~Worker()
{
cout<<"~Worker()"<<endl;
}
void carry()
{
cout<<m_strCode<<endl;
cout<<"Worker--carry"<<endl;
}
protected:
string m_strCode;
};
class Farmer:virtual public Person
{
public:
Farmer(string name="jack",string color="pink"):Person("Farmer"+color)
{
m_strName=name;
cout<<"Farmer()"<<endl;
}
virtual ~Farmer()
{
cout<<"~Farmer()"<<endl;
}
void sow()
{
cout<<m_strName<<endl;
cout<<"Farmer--sow"<<endl;
}
protected:
string m_strName;
};
class MigrantWorker : public Worker,public Farmer
{
public:
MigrantWorker(string name,string code,string color):Farmer(name,color),Worker (code,color)
{
cout<<"MigrantWorker()"<<endl;
}
virtual ~MigrantWorker()
{
cout<<"~MigrantWorker()"<<endl;
}
};
int main(void)
{
MigrantWorker *p=new MigrantWorker("Merry","200","yellow");
p->Farmer::printColor();
p->Worker::printColor();
delete p;
p=NULL;
system("pause");
return 0;
}
此时我们实例化MigrantWorker的时候只有一份Person的数据,但打印的是pink证明在这种菱形的继承关系中数据只是父类初始化时的默认值