C++虚继承

我们在解决实际问题的时候,多继承和多重继承可能出现下面的情况

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;
}

C++虚继承

我们看到有两个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证明在这种菱形的继承关系中数据只是父类初始化时的默认值

C++虚继承