C++类的多重继承_第1页
C++类的多重继承_第2页
C++类的多重继承_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、前面讨论的是单继承,即一个类是从一个基类派生而来的。实际上,常常有这样的情况:一个派生类有两个或多个基类,派生类从两个或多个基类中继承所需的属性。C+为了适应这种情况,允许一个派生类同时继承多个基类,这种行为称为 多重继承(multiple inheritance)。声明多重继承的方法如果已声明了类A、类B和类C,可以声明多重继承的派生类 D:class D: public A, private B, protected C类D新增加的成员D是多重继承的派生类,它以公用继承方式继承A类,以私有继承方式继承B类,以保护继承方式继承C类。D按不同的继承方式的规则继承A B、C的属性,确定各基类的成

2、员在派生类中的访问权限。多重继承派生类的构造函数多重继承派生类的构造函数形式与单继承时的构造函数形式基本相同,只是在初始表中包含多彳、基类构造函数。如派生类构造函数名(总参数表列):基类1构造函数(参数表列),基类2构造函数(参数表列),基类3构造函数(参数表列)派生类中新增数成员据成员初始化i吾句各基类的排列顺序任意。派生类构造函数的执行顺序同样为:先调用基类的构造函数,再执行派生类构造函数的函数体。调用基类构造函数的顺序是按照声明派生类时基类岀现的顺序。例声明一个教师仃eacher)类和一个学生(Student)类,用多重继承的方式声明一个研究生(Graduate)派生类。教师类中包括数据

3、成员 name (姓名)、age (年龄)、title (职称)。学生类中包括数据成员name 1 (姓名)、age(性别)、score (成绩)。在定义派生类对象时给出初始化的数据,然后输出这些数据。#includeviostream#in eludevstringusingnamespace std ;classTeacher/ 声明类 Teacher(教师)nam,int a, string t) 构造函数n ameam;age=a;title=t;void display()输出教师有矢数据coutvname:vv namevve ndl;coutvagevvagevve ndl;co

4、utvvtitlevvtitlevvend I;n ame;int age;string title;/ 职称;class Student/ 定义类 Student(学生)public:Student(char nam,char s,float sco)strcpy( namel ,nam);sex=s;score=sco;构造函数void display 1 ()/输出学生有尖数据coutvvHname:Hv vn ame1 vve ndl;coutvvHsex:,vvsexvve ndl;namel;char sex;floatscore;/ 成绩;class Graduate:publi

5、c Teacher,public Student / 声明多重继承的派生类 Graduatepublic:Graduate(string namjnta,char s, string t,float sco5float w):Teacher(nam,a,t),Student(nam5s,sco),wage(w) void show()输出研究生的有矢数据coutvvFame:”v vn amevve ndl;coutvHage:Hvagevve ndl;coutvvHsex:vvsexvve ndl;coutvvHscore:Hvvscorevvendl;couWtitle/vvtitlevv

6、endl;coutvvHwages:Hvvwagevve ndl;private:float wage; / 工资;int main()Graduate grach (”Wangli”,24,fassistant”,;0;return 0;程序运行结果如下:name: Wang-liage: 24 sex:fscore: title: assistaneewages:由于此程序的目的只是说明多重 继承的使用方法,因此对各类的成员尽量简化(例如没有部门、专业、授 课名称等项目),以减少篇幅。有了此基础,读者可以举一反三,根据实际需要写岀更复杂的程序。请注意:由于在两个基类中把数据成员声明为pro

7、tected,因此可以通过派生类的成员函数引用基类的成员。如果在基类中把数据成员声明为private,则派生类成员函数不能引用这些数据。有些读者可能已注意到:在两个基类中分别用name和namel来代表姓名,其实这是同一个人的名字,从Graduate类的构造函数中可以看到总参数表中的参数nam分别传递给两个基类的构造函数,作为基类构造函数的实参。现在两个基类都需要有姓名这一项,能否用同一个名字来代表大家可以亲自测试一下。实际上,在本程序中只作这样的修改是不行的,因为在同一个派生类中存在着两个同名的数据成员,在派生类的成员函数 show中引用name时就会出现二义性,编译系统无法判定应该选择哪一个基类中的names这就是下一节要讨论的问题。为了解决这个矛盾,程序中分别用name和namel来代表两个基类中的姓名,这样程序能通过编译,正常运行。但 是应该说这是为了通过编译而采用的并不高明的方法。虽然在本程序中这是可行的,但它没有实用 意义,因为绝大多 数的基类都是已经编写好的、已存在的,用户可以利用它而无法修改它。解决这个问题有一个好方法:在两个基类中 可以都使用同一个数据成员名name而在show函数中引用数据成员时指明其作用域,如coutwHname:HvTeacher:na

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论