算法與數(shù)據(jù)結(jié)構(gòu):lecture 9 多重繼承_第1頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 9 多重繼承_第2頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 9 多重繼承_第3頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 9 多重繼承_第4頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 9 多重繼承_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、多重繼承一個類可以從一個或多個基類派生而來。根據(jù)派生類繼承基類的個數(shù),將繼承分為單繼承(單一繼承)和多繼承(多重繼承)。當(dāng)派生類有多個基類時稱為多繼承。單繼承可以看作是多繼承的一個特例,多繼承可以看作是多個單繼承的組合。實例教師類研究生類學(xué)生類多重繼承派生類的定義class : , ;class D: public A, private B, protected C;多重繼承派生類的構(gòu)造函數(shù)成員初始化表中需要包含多個基類構(gòu)造函數(shù)一般形式():(), () ;執(zhí)行順序:先調(diào)用基類的構(gòu)造函數(shù),再執(zhí)行派生類構(gòu)造函數(shù)的函數(shù)體基類構(gòu)造函數(shù)按照聲明派生類時基類的出現(xiàn)順序來執(zhí)行。#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函數(shù)中能不能有: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(); /該調(diào)用哪個init()? Teach_A.print(); /print函數(shù)該輸出哪個ID? /學(xué)號和教師工號并不同解決方案一用作用域運算符“:”限定,顯式訪問基類成員。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(); /調(diào)用哪個init? /根據(jù)同名覆蓋原則 /調(diào)用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;解決方案二:虛基類的引入派生類:研究生類直接基類:教師類、學(xué)生類直接

13、基類來自于同一個基類 (共同基類):Person類教師類和學(xué)生類 具有數(shù)據(jù)成員ID,不再具有name Person類具有數(shù)據(jù)成員name情況是否有改善?教師類繼承Person類的name學(xué)生類繼承Person類的name研究生類多重繼承后仍有兩個同名name數(shù)據(jù)備份教師類研究生類學(xué)生類Person類publicpublicpublicpublic虛基類的作用和聲明將Person類聲明為虛基類使研究生類在多重繼承來自共同基類的直接基類時只保留一份同名成員研究生類中只有一份name數(shù)據(jù),來自于間接基類Person類虛基類的聲明教師類研究生類學(xué)生類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;虛基類的初始化引入虛基類之前的情況在研究生類的構(gòu)造函數(shù)進(jìn)行初始化時,調(diào)用教師類和學(xué)生類各自的構(gòu)造函數(shù)進(jìn)行初始化,而教師類和學(xué)生類各自的構(gòu)造函數(shù)又分別去調(diào)用Person類的構(gòu)造函數(shù)研究生類的構(gòu)造函數(shù)中只需要寫出它的直接基類Teacher和Student的構(gòu)造函數(shù)即可教師類研究生類學(xué)生類Person類publicpublicpublicpublic引入虛基類后,研究生類中只保留了一份同名數(shù)據(jù)name同名數(shù)據(jù)來自虛基類Person類這一份數(shù)據(jù)成員的初始化必須由派生類直接完成如果沿用原來的方式,共同基類Person的初始化由Teac

18、her和Student分別調(diào)用,將進(jìn)行多次初始化教師類研究生類學(xué)生類Person類virtual publicvirtual publicpublicpublic虛基類初始化的說明C+編譯系統(tǒng)只執(zhí)行最后派生類對虛基類的構(gòu)造函數(shù)的調(diào)用,而忽略虛基類的其它派生類對虛基類的構(gòu)造函數(shù)的調(diào)用,保證虛基類的數(shù)據(jù)成員不會被多次初始化構(gòu)造函數(shù)的調(diào)用順序(1)先調(diào)用虛基類的構(gòu)造函數(shù),再調(diào)用非虛基類的構(gòu)造函數(shù)(2)若同一層次中包含多個虛基類,其調(diào)用順序為定義時的順序(3)若虛基類由非虛基類派生而來,則仍按先調(diào)用基類構(gòu)造函數(shù),再調(diào)用派生類構(gòu)造函數(shù)的順序#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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論