多重继承:一个基类有一个派生类,这个派生类又有一个派生类
多继承:一个派生类有多个基类
下面我们看一个多重继承的例子
#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,我们通过结果可以清晰地看到执行过程~