算法与数据结构:lecture 9 多重继承_第1页
算法与数据结构:lecture 9 多重继承_第2页
算法与数据结构:lecture 9 多重继承_第3页
算法与数据结构:lecture 9 多重继承_第4页
算法与数据结构:lecture 9 多重继承_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、多重继承一个类可以从一个或多个基类派生而来。根据派生类继承基类的个数,将继承分为单继承(单一继承)和多继承(多重继承)。当派生类有多个基类时称为多继承。单继承可以看作是多继承的一个特例,多继承可以看作是多个单继承的组合。实例教师类研究生类学生类多重继承派生类的定义class : , ;class D: public A, private B, protected C;多重继承派生类的构造函数成员初始化表中需要包含多个基类构造函数一般形式():(), () ;执行顺序:先调用基类的构造函数,再执行派生类构造函数的函数体基类构造函数按照声明派生类时基类的出现顺序来执行。#include using

2、 namespace std;class Bedpublic:Bed( ):weight(0)void Sleep( )coutSleeping.n;void SetWeight(int w)weight=w;protected:int weight;class Sofapublic:Sofa( ):weight(0);void WatchTV( )coutWatching TV.n;void SetWeight(int w)weight=w;protected:int weight;class SleeperSofa: public Bed, public Sofapublic:Sleepe

3、rSofa( )void FoldOut( )coutFold out the sofa.n;int main( )SleeperSofa ss;ss.WatchTV( );ss.FoldOut( );ss.Sleep( );return 0;main函数中能不能有:ss.SetWeight(0);#include #include using namespace std;class Teacher public: Teacher(string nam,int a,string t) name=nam; age=a; title=t; void display() coutname:namee

4、ndl; coutageageendl; couttitle:titleendl; protected: string name; int age; string title; ;class Student public: Student(string nam,char s,float sco) name1=nam; sex=s; score=sco; void display1( ) coutname:name1endl; coutsex:sexendl; coutscore:scoreendl; protected: string name1; char sex; float score;

5、 ;class Graduate:public Teacher,public Student public: Graduate(string nam,int a,char s,string t,float sco,float w): Teacher(nam,a,t),Student(nam,s,sco),wage(w) void show( ) coutname:nameendl; coutage:ageendl; coutsex:sexendl; coutscore:scoreendl; couttitle:titleendl; coutwages:wageendl; private: fl

6、oat wage; ; int main( ) Graduate grad1(Wang, 24, f, assistant, 89.5, 1234.5); grad1.show( ); return 0;多重继承的二义性问题情形一:两个基类有同名成员class student: protected: int ID; char* name; char* major; public: init(); class teacher protected: int ID; char* name; char* title; public: init(); class graduate: public stu

7、dent, public teacher public: void print() cout IDendl; coutnameendl; main() graduate Teach_A; Teach_A.init(); /该调用哪个init()? Teach_A.print(); /print函数该输出哪个ID? /学号和教师工号并不同解决方案一用作用域运算符“:”限定,显式访问基类成员。main() graduate Teach_A; Teach_A.teacher:init(); Teach_A.student:init(); Teach_A.print();class graduate:

8、 public student, public teacher public: void print(); coutteacher:IDendl; coutteacher:nameendl; coutstudent:IDendl; coutmajorendl; #include using namespace std;class Apublic: A(int a0=10):a(a0) int a; void display( ) couthappyendl; ;class Bpublic: B(int a0=20):a(a0) int a; void display( ) coutgooden

9、dl; ;class C: public A, public B;int main( )C c;coutc.A:aendl;c.B:display( );return 0;void main()SleeperSofa ss;ss.WatchTV( );ss.FoldOut( );ss.Sleep( );ss.Sofa:SetWeight(15);有什么问题?情形二:两个基类和派生类都有同名成员class student: protected: int ID; char* name; char* major; public: void init(); class teacher protecte

10、d: int ID; char* name; char* title; public: void init(); class graduate: public student, public teacher public: void init(); void print(); main() graduate Teach_A; Teach_A.init(); /调用哪个init? /根据同名覆盖原则 /调用graduate的init Teach_A.print();#include using namespace std;class Apublic: A(int a0=10):a(a0) int

11、 a; void display( ) couthappyendl; ;class Bpublic: B(int a0=20):a(a0) int a; void display( ) coutgoodendl; ;class C: public A, public Bpublic: C(int a0=30):a(a0) int a; void display( ) coutgood morningendl; ;int main( )C c;coutc.aendl;coutc.A:aendl;c.B:display( );c.display( );return 0;情形一的一种特殊情况类A和类

12、B从同一基类N派生,从而分别继承了N的成员,这样派生于A和B的类C将拥有两份N的成员。#include using namespace std;class Npublic: int a; void display( ) coutaendl; ;class A:public Npublic:A( )a=10;class B:public Npublic:B( )a=20;class C: public A, public B;int main( )C c;coutc.A:aendl;c.B:display();return 0;解决方案二:虚基类的引入派生类:研究生类直接基类:教师类、学生类直接

13、基类来自于同一个基类 (共同基类):Person类教师类和学生类 具有数据成员ID,不再具有name Person类具有数据成员name情况是否有改善?教师类继承Person类的name学生类继承Person类的name研究生类多重继承后仍有两个同名name数据备份教师类研究生类学生类Person类publicpublicpublicpublic虚基类的作用和声明将Person类声明为虚基类使研究生类在多重继承来自共同基类的直接基类时只保留一份同名成员研究生类中只有一份name数据,来自于间接基类Person类虚基类的声明教师类研究生类学生类Person类virtual publicvirtu

14、al publicpublicpublicclass Person /正常申明class Teacher :virtual public Personclass Student :virtual public Personclass Grduate : public Teacher, public Student #include using namespace std;class Npublic: int a; void display( ) coutaendl; ;class A:virtual public Npublic:A( )a=10;class B:virtual public

15、Npublic:B( )a=20;class C: public A, public B;int main( )C c;coutc.aendl;c.display( );return 0;#include using namespace std;class Furniture public:Furniture(int w=0):weight(w)void SetWeight(int w)weight=w;int GetWeight( )return weight; protected:int weight;class Bed:virtual public Furniture public:vo

16、id Sleep( )coutSleeping.n;class Sofa:virtual public Furniture public:void WatchTV( )coutWatching TV.n;class SleeperSofa:public Bed, public Sofapublic:SleeperSofa( )void FoldOut( )coutFold out the sofa.n;void main( )SleeperSofa ss;ss.WatchTV( );ss.FoldOut( );ss.Sleep( );coutss.GetWeight( )endl;ss.Set

17、Weight(15);coutss.GetWeight( )endl;虚基类的初始化引入虚基类之前的情况在研究生类的构造函数进行初始化时,调用教师类和学生类各自的构造函数进行初始化,而教师类和学生类各自的构造函数又分别去调用Person类的构造函数研究生类的构造函数中只需要写出它的直接基类Teacher和Student的构造函数即可教师类研究生类学生类Person类publicpublicpublicpublic引入虚基类后,研究生类中只保留了一份同名数据name同名数据来自虚基类Person类这一份数据成员的初始化必须由派生类直接完成如果沿用原来的方式,共同基类Person的初始化由Teac

18、her和Student分别调用,将进行多次初始化教师类研究生类学生类Person类virtual publicvirtual publicpublicpublic虚基类初始化的说明C+编译系统只执行最后派生类对虚基类的构造函数的调用,而忽略虚基类的其它派生类对虚基类的构造函数的调用,保证虚基类的数据成员不会被多次初始化构造函数的调用顺序(1)先调用虚基类的构造函数,再调用非虚基类的构造函数(2)若同一层次中包含多个虚基类,其调用顺序为定义时的顺序(3)若虚基类由非虚基类派生而来,则仍按先调用基类构造函数,再调用派生类构造函数的顺序#include #include using namespac

19、e std;class Person public: Person(string name,char s,int a):name(name),sex(s),age(a) protected: string name; char sex; int age;class Teacher:virtual public Person public: Teacher(string name,char s,int a, string t) : Person(name,s,a) title=t; protected: string title; ;class Student:virtual public Pe

20、rson public: Student(string name,char s,int a,float sco): Person(name,s,a),score(sco) protected: float score; ;class Graduate:public Teacher,public Student public: Graduate(string name,char s,int a,string t,float sco,float w): Person(name,s,a),Teacher(name,s,a,t),Student(name,s,a,sco),wage(w) void s

21、how( ) coutname:nameendl; coutage:ageendl; coutsex:sexendl; coutscore:scoreendl; couttitle:titleendl; coutwages:wageendl; private: float wage; ; int main( ) Graduate grad1(Wang-li,f,24,assistant,89.5,1234.5); grad1.show( ); return 0;#includeusing namespace std;class Apublic: A()coutAendl;class B: public Apublic: B()coutBendl;class C:public Apublic: C( )coutCendl;class D:public B,public Cpublic:D( )coutDendl;int main( )D obj;return 0;#includeusing namespace std;class Apublic: A(int m=0)x=m;coutAendl; int x;class B: vi

温馨提示

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

评论

0/150

提交评论