C++多继承多重继承

多重继承:一个基类有一个派生类,这个派生类又有一个派生类

多继承:一个派生类有多个基类

下面我们看一个多重继承的例子

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

/**
 * 定义人类: Person
 * 数据成员: m_strName
 * 成员函数: attack()
 */
class Person
{
public:
	Person(string name="jim")
	{
		m_strName=name;
		cout<<"Person()"<<endl;
	}
    virtual ~Person()
	{
		cout<<"~Person()"<<endl;
	}
	void play()
	{
		cout << m_strName<< endl;
		cout << "Person->play()" << endl;
	}
protected:
	string m_strName;
};

/**
 * 定义士兵类: Soldier
 * 士兵类公有继承人类
 * 数据成员: m_strName
 * 成员函数: attack()
 */
class Soldier:public Person
{
public:
	Soldier(string name="jim",int age=10)
	{
         m_strName=name;
		 m_iAge=age;
		 cout<<"Soldier()"<<endl;
	}
	~Soldier()
	{
         cout<<"~Soldier()"<<endl;
	}
	void work()
	{
		cout << m_strName<< endl;
		cout << m_iAge<< endl;
		cout << "Soldier--work()"<< endl;
	}
protected:
	int m_iAge;
};
class  Infantry : public Soldier
{
public:
	Infantry(string name="jom",int age=10)
	{
		 m_strName=name;
		 m_iAge=age;
		cout<<"Infantry()"<<endl;
	}
    ~Infantry()
	{
		cout<<"~Infantry()"<<endl;
	} 
	void attack()
	{
       cout << m_strName<< endl;
	   cout << m_iAge<< endl;
	   cout << "Infantry--attack()"<< endl;
	}
};
void test1(Person p)
{
	p.play();
}
void test2(Person &p)
{
	p.play();
}
void test3(Person *p)
{
	p->play();
}
int main(void)
{
    /*Soldier soldier;// 实例士兵对象
	soldier.m_strName="tomato";// 向士兵属性赋值"tomato"
   	soldier.Person::m_strName= "Jim";// 通过士兵对象向人类属性赋值"Jim"
	cout << soldier.m_strName << endl;
	cout << soldier.Person::m_strName << endl;
    soldier.attack();// 调用士兵对象方法
    soldier.Person::attack();   // 通过士兵对象调用人类方法*/
    Infantry infantry;
	system("pause");
	return 0;
}

我们实例化一个多重继承的时候我们可以看到他的调用顺序

按照继承的顺序调用构造函数

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

/**
 * 定义人类: Person
 * 数据成员: m_strName
 * 成员函数: attack()
 */
class Person
{
public:
	Person(string name="jim")
	{
		m_strName=name;
		cout<<"Person()"<<endl;
	}
    virtual ~Person()
	{
		cout<<"~Person()"<<endl;
	}
	void play()
	{
		cout << m_strName<< endl;
		cout << "Person->play()" << endl;
	}
protected:
	string m_strName;
};

/**
 * 定义士兵类: Soldier
 * 士兵类公有继承人类
 * 数据成员: m_strName
 * 成员函数: attack()
 */
class Soldier:public Person
{
public:
	Soldier(string name="jim",int age=10)
	{
         m_strName=name;
		 m_iAge=age;
		 cout<<"Soldier()"<<endl;
	}
	~Soldier()
	{
         cout<<"~Soldier()"<<endl;
	}
	void work()
	{
		cout << m_strName<< endl;
		cout << m_iAge<< endl;
		cout << "Soldier--work()"<< endl;
	}
protected:
	int m_iAge;
};
class  Infantry : public Soldier
{
public:
	Infantry(string name="jom",int age=10)
	{
		 m_strName=name;
		 m_iAge=age;
		cout<<"Infantry()"<<endl;
	}
    ~Infantry()
	{
		cout<<"~Infantry()"<<endl;
	} 
	void attack()
	{
       cout << m_strName<< endl;
	   cout << m_iAge<< endl;
	   cout << "Infantry--attack()"<< endl;
	}
};
void test1(Person p)
{
	p.play();
}
void test2(Person &p)
{
	p.play();
}
void test3(Person *p)
{
	p->play();
}
int main(void)
{
    /*Soldier soldier;// 实例士兵对象
	soldier.m_strName="tomato";// 向士兵属性赋值"tomato"
   	soldier.Person::m_strName= "Jim";// 通过士兵对象向人类属性赋值"Jim"
	cout << soldier.m_strName << endl;
	cout << soldier.Person::m_strName << endl;
    soldier.attack();// 调用士兵对象方法
    soldier.Person::attack();   // 通过士兵对象调用人类方法*/
    Infantry infantry;
	test1(infantry);
	test2(infantry);
	test3(&infantry);
	system("pause");
	return 0;
}

下面这是这个程序的执行结果

在执行了test1之后有一个~Person(),代表的是在调用这个函数的时候需要形成一个临时的对象,所以才会在执行完之后有销毁操作

下面给出一个多继承的实例

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

class Worker
{
public:
	Worker(string code="001")
	{
       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:
	Farmer(string name="Jack")
	{
		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 Farmer ,public Worker
{
public:
	MigrantWorker(string name,string code):Farmer(name),Worker(code)
	{
		m_strName=name;
		m_strCode=code;
		cout<<"MigrantWorker()"<<endl;
	}
	virtual ~MigrantWorker()
	{
     	cout<<"~MigrantWorker()"<<endl;
	}
protected:
	string m_strCode;
	string m_strName;
};
int main(void)
{
    MigrantWorker *p=new MigrantWorker("Merry","100"); 
	p->carry();
	p->sow();
	delete p;
	system("pause");
	return 0;
}

运行结果如下

我们可以看到要是实例化一个多继承的MigrantWorker的类先要执行Farmer的构造函数,再执行Worker,再执行MigrantWorker,我们通过结果可以清晰地看到执行过程~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值