继承的基础知识2——多重继承

来源:互联网 发布:晨曦计算式数据没了 编辑:程序博客网 时间:2024/05/20 17:42

一、一些基本该类

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、例子:实现虚基类的继承方式,观察输出结果从而熟悉虚基类的使用方法。





0 0
原创粉丝点击