发布日期:2015-12-29 10:14 来源: 标签: 编程语言 C++教程 C++继承 C++多重继承
C++中继承除了从单个基类派生以外还可以从多个基类派生继承创建新类。这种继承方式称为多重继承,下面将会详细讲述多重继承的基本应用情况,希望大家多多支持中国站长网络学院。
      C++中继承除了从单个基类派生以外还可以从多个基类派生继承创建新类。这种继承方式称为多重继承,下面将会详细讲述多重继承的基本应用情况。所谓多重继承,即派生类继承至多个基类,并且拥有其多个基类的成员。多重继承方式与单继承方式基本语法实现形式相同,仅仅是在继承实现时通过逗号分隔符隔开多个基类名,其一般形式如下。
派生类: public/protected/private 基类1,基类2…
     派生类继承至多个基类,即派生类中拥有多个基类成员,当然基类的构造函数与析构函数除外。多重继承除了在定义形式上与单继承稍有不同,其余访问控制等操作运用基本与单继承一致。下面通过一个完整实例演示前面小节分析的软件学院机构人员继承层次,其中行政人员同时又可以是老师的身份部分就包括多重继承的运用,即该类同时具有行政人员类与教师类的特征。
1.准备实例
打开UE工具,创建新的空文件并且另存为chapter1008_01.h、chapter1008_01.cpp、chapter1008_02.h、chapter1008_02.cpp、chapter1008_03.h、chapter1008_03.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
//行政人员类头文件chapter1008_01.h
#ifndef ADMINISTRATION_H
#define ADMINISTRATION_H
#include <iostream>
#include <string>
using namespace std;
class Administration
{
         public:
                   Administration(){}
                   ~Administration(){}
                   voidsetAdministrationId(int id);
                   voidsetAdministrationName(string name);
         protected:
                   intm_AdministrationId;
                   stringm_AdministrationName;
};
#endif
//行政人员类源文件chapter1008_01.cpp
#include "chapter1008_01.h"
void Administration::setAdministrationId(int id)
{
         m_AdministrationId= id;
}
void Administration::setAdministrationName(stringname)
{
         m_AdministrationName= name;
}
//教师类头文件chapter1008_02.h
#ifndef TEACHER_H
#define TEACHER_H
#include <iostream>
#include <string>
using namespace std;
class Teacher
{
         public:
                   Teacher(){}
                   ~Teacher(){}
                   voidsetTeacherId(int id);
                   voidsetTeacherName(string name);
         protected:
                   intm_teacherId;
                   stringm_teacherName;
};
#endif
//教师类源文件chapter1008_02.cpp
#include "chapter1008_02.h"
 
void Teacher::setTeacherId(int id)
{
         m_teacherId= id;
}
void Teacher::setTeacherName(string name)
{
         m_teacherName= name;
}
//行政管理同时又是教师身份人员类头文件chapter1008_03.h
#ifndef ADMINISTRATIONTEACHER_H
#define ADMINISTRATIONTEACHER_H
#include "chapter1008_02.h"
#include "chapter1008_01.h"
class AdministrationTeacher:publicAdministration,public Teacher
{
         public:
                   AdministrationTeacher(){}
                   ~AdministrationTeacher(){}
                   voidshowAdministrationTeacherInfo();
};
#endif
//行政人员同时又是教师身份人员类的源文件chapter1008_03.cpp
#include "chapter1008_03.h"
voidAdministrationTeacher::showAdministrationTeacherInfo()
{
         cout<<"TheAdministration id:"<<m_AdministrationId<<endl;
         cout<<"TheAdministration name:"<<m_AdministrationName<<endl;
         cout<<"TheTeacher id:"<<m_teacherId<<endl;
         cout<<"TheTeacher name:"<<m_teacherName<<endl;
}
int main()
{
         AdministrationTeacheradministrationTeacher;
         administrationTeacher.setAdministrationId(1);
         administrationTeacher.setAdministrationName("jack");
         administrationTeacher.setTeacherId(2);
         administrationTeacher.setTeacherName("john");
         administrationTeacher.showAdministrationTeacherInfo();
         return0;
}
      本实例程序主要通过教师类继承体系演示了多重继承的功能。程序主要由主函数与教师继承类组成,教师继承类体系中包含学校行政人员类、教师类以及两者身份兼有的类。程序具体剖析见程序注释与后面讲解。
2.编辑makefile
Linux平台下其makefile编译文件中涉及三个头文件以及三个源代码文件,makefile文件编辑如下。
OBJECTS=chapter1008_01.o chapter1008_02.ochapter1008_03.o
CC=g++
chapter1008_03: $(OBJECTS)
         $(CC)$(OBJECTS) -o chapter1008_03
chapter1008_01.o: chapter1008_01.h
chapter1008_02.o: chapter1008_02.h
chapter1008_03.o: chapter1008_03.h
clean:
         rm-f chapter1008_03 core $(OBJECTS)
submit:
         cp-f -r chapter1008_03 ../bin
         cp-f -r *.h ../include
上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
      当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer @localhost src]$ make
g++    -c -ochapter1008_01.o chapter1008_01.cpp
g++    -c -ochapter1008_02.o chapter1008_02.cpp
g++    -c -o chapter1008_03.o chapter1008_03.cpp
g++ chapter1008_01.o chapter1008_02.ochapter1008_03.o -o chapter1008_03
[developer @localhost src]$ make submit
cp -f -r chapter1008_03 ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./chapter1008_03
The Administration id:1
The Administration name:jack
The Teacher id:2
The Teacher name:john
      多重继承派生类拥有多个基类的所有成员,即派生类拥有多个基类的特性。上述实例中根据软件学院人员机构分析,有一类人员同时兼顾着行政人员与教师的特性,此时分析继承层次时可以将其定义为多重继承的方式。
      本实例中总共涉及三个类,Administrtion、Teacher与AdministrationTeacher分别表示行政人员类、教师类以及兼顾行政管理以及教师人员类。其中AdministrationTeacher类继承至Administrtion与Teacher类。而Administration类中除了构造与析构函数同时还包含两个公开的接口成员分别为,设置行政人员编号与设置行政人员的姓名的方法,另外还包含两个私有数据成员,分别表示行政人员的编号与姓名。而Teacher类中同样包含两个公开接口成员分别为,设置教师人员编号以及教师人员姓名的方法,同时也包含两个私有数据成员分别表示教师编号与姓名。最终继承至前两个类的AdministrationTeacher类在继承所有的方法成员之外,还包含该类添加的公开成员方法用于打印所设置的编号以及姓名信息。
      实例主程序中首先定义AdministrationTeacher类对象实例administrationTeacher,随后使用该对象实例调用其继承至基类的方法成员setAdministrationId、setAdministrationName、setTeacherId以及setTeacherName,并且根据传入实参设置该类中的保护型数据成员。由于基类中数据成员为保护类型,在继承类中依然保持保护类型的特性,那么最后对象实例administrationTeacher调用派生类自定义方法showAdministrationTeacherInfo,该方法中访问了基类中的保护成员,用于在屏幕上显示设置的成员信息。
      多重继承在C++应用软件开发中并不常用。因为其继承方式的使用不当会增加软件复杂出错的可能性,同时也可以会影响软件处理的效率。最常见的当多个基类中拥有同个方法成员,而这些基类被派生类继承的方式又不相同时,处理会变得复杂难懂。所以除非必须的处理场景下,一般不建议使用。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。