一、一些基本该类
1、概念:派生类是继承两个或者两个以上的基类而生成的,这一过程叫做多重继承。多重继承的派生类中的成员大大的扩充了。
2、定义格式:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,......
3、例子:学会定义和使用基类实现多重继承
/**********************************************
时间:2016年10月4日09:23:53
功能:学会多重继承的基本概念,理清父类和子类构造
函数和析构函数的执行顺序。
***********************************************/
#include <iostream>
using namespace std;
class Father //定义基类1
{
public:
Father(char *pf); //构造函数
~Father(); //析构函数
void fprint(); //成员函数
private:
char fname[10];
};
//函数的实现
Father::Father(char *pf) //构造函数的实现
{
strcpy(fname,pf);
cout<<"in father constructor"<<endl;
}
Father::~Father() //析构函数的实现
{
cout<<"in father deconstructor"<<endl;
}
void Father::fprint() //成员函数的实现
{
cout<<fname<<endl;
}
class Mother //定义基类2
{
public:
Mother(char *pm); //构造函数
~Mother(); //析构函数
void mprint(); //成员函数
private:
char mname[10];
};
//函数的实现
Mother::Mother(char *pm) //构造函数的实现
{
strcpy(mname,pm);
cout<<"in mother constructor"<<endl;
}
Mother::~Mother() //析构函数的实现
{
cout<<"in mother deconstructor"<<endl;
}
void Mother::mprint() //成员函数的实现
{
cout<<mname<<endl;
}
//多重继承产生派生类
class Son : public Father,public Mother
{
public:
Son(char *ps); //派生类构造函数
~Son(); //派生类析构函数
void sprint();
private:
char sname[10];
};
Son::Son(char *ps):Father("king"),Mother("hu") //***派生类构造函数的实现,因为在构造子类对象时,需要先构造父类对象(除非没有父类)。 { //因此需要在子类的构造函数中对父类进行初始化。
strcpy(sname,ps);
cout<<"in son constructor"<<endl;
}
Son::~Son() //派生类析构函数的实现
{
cout<<"in son deconstrucror"<<endl;
}
void Son::sprint()
{
Father::fprint(); //可以调用基类中的公有成员
Mother::mprint();
cout<<sname<<endl;
}
void main()
{
Son s1("kim");
s1.sprint();
}
二、多重继承存在的问题和解决方法
1、多重继承存在的问题
(1)多重继承的模糊性:多个基类中存在相同的函数,派生类定义的对象在调用该函数时会产生二义性的问题。
(2)重复继承:举个简单的例子,fish和bird具有同一个基类animal,当fish和bird同时作为flyfish的基类的时候,flyfish将重复继承两次animal。
2、解决重复继承的方法:定义虚基类,其作用是可以在继承的过程中只保留一份基类成员,这样就避免了重复继承而造成的二义性。
3、虚基类的声明格式:
class <派生类名>:virtual <继承方式> <基类名>
{
//派生类体
}
4、使用虚基类中应该注意的一些问题:
基类如果被多个派生类继承,那么派生类中只保留一份基类的成员。因为一个基类可以在生成一个派生类时作为虚基类,当生成另外一个类时可以不作为虚基类,这样 就保证了派生类中只保留一份基类的成员。
C++编译系统规定,如果所有直接派生类继承的都是虚基类,那么间接派生类就保留基类的成员,同时还要负责初始化基类的成员,这样就保证了在所有派生类中基类 只保留一份成员。应该将所有的直接派生类继承虚基类,从而避免产生二义性的问题。
5、例子:实现虚基类的继承方式,观察输出结果从而熟悉虚基类的使用方法。