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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值