C++面向?qū)ο蟪绦蛟O(shè)計第5章_第1頁
C++面向?qū)ο蟪绦蛟O(shè)計第5章_第2頁
C++面向?qū)ο蟪绦蛟O(shè)計第5章_第3頁
C++面向?qū)ο蟪绦蛟O(shè)計第5章_第4頁
C++面向?qū)ο蟪绦蛟O(shè)計第5章_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1第五章 繼承和派生類2繼承性是面向?qū)ο蟪绦蛟O(shè)計中最重要的機(jī)制。這種繼承性是面向?qū)ο蟪绦蛟O(shè)計中最重要的機(jī)制。這種機(jī)制機(jī)制提供了無限重復(fù)利用程序資源的一種途徑提供了無限重復(fù)利用程序資源的一種途徑。通過通過C+語言中的繼承機(jī)制,語言中的繼承機(jī)制,可以擴(kuò)充和完善舊的可以擴(kuò)充和完善舊的程序設(shè)計以適應(yīng)新的需求。程序設(shè)計以適應(yīng)新的需求。這樣不僅可以節(jié)省程序開發(fā)的時間和資源,并且為這樣不僅可以節(jié)省程序開發(fā)的時間和資源,并且為未來程序增添了新的資源。未來程序增添了新的資源。5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用3class Student int num; char name30; ch

2、ar sex; public: void display( ) /對成員函數(shù)對成員函數(shù)display的定義的定義 coutnum: numendl; coutname: nameendl; coutsex: sexendl; ;5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用4class Studend1 int num; /此行原來己有此行原來己有 char name20; /此行原來己有此行原來己有 char sex; /此行原來己有此行原來己有 int age; char addr20; public: void display( ) ; /此行原來己有此行原來己有 cout

3、num: numendl; /此行原來己有此行原來己有 coutname: nameendl;/此行原來己有此行原來己有 coutsex: sexendl; /此行原來己有此行原來己有 coutage: ageendl; coutaddress: addrendl; ; 5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用5利用原來定義的類利用原來定義的類StudentStudent作為基礎(chǔ),再加上新的作為基礎(chǔ),再加上新的內(nèi)容即可,以減少重復(fù)的工作量。內(nèi)容即可,以減少重復(fù)的工作量。 C+C+提供的繼提供的繼承機(jī)制就是為了解決這個問題。承機(jī)制就是為了解決這個問題。 在在C+中所謂中所謂“

4、繼承繼承”就是在一個已存在的類的基就是在一個已存在的類的基礎(chǔ)上建立一個新的類。礎(chǔ)上建立一個新的類。已存在的類稱為已存在的類稱為“基類基類(base class)”或或“父類父類(father class)”。新建立的類稱為新建立的類稱為“派生類派生類(derived class)”或或“子類子類(son class)”。 5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用6class Student1: public Student/聲明基類是聲明基類是Studentprivate: int age; /新增加的數(shù)據(jù)成員新增加的數(shù)據(jù)成員 string addr; /新增加的數(shù)據(jù)成員新

5、增加的數(shù)據(jù)成員public: void display_1( ) /新增加的成員函數(shù)新增加的成員函數(shù) coutage: ageendl; coutaddress: addrendl; ;5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用7類類A派生類派生類B:類:類A為基類,類為基類,類B為派生類。為派生類。AB新增加的成員數(shù)新增加的成員數(shù)據(jù)和成員函數(shù)據(jù)和成員函數(shù)5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用8在在C+語言中,語言中,一個派生類可以從一個基類派生,一個派生類可以從一個基類派生,也可以從多個基類派生。也可以從多個基類派生。從一個基類派生的繼承稱為單繼承;從

6、一個基類派生的繼承稱為單繼承;從二個或多個基類派生的繼承稱為多重繼承。從二個或多個基類派生的繼承稱為多重繼承。通過繼承機(jī)制,可以利用已有的數(shù)據(jù)類型來定義新通過繼承機(jī)制,可以利用已有的數(shù)據(jù)類型來定義新的數(shù)據(jù)類型。的數(shù)據(jù)類型。所定義的新的數(shù)據(jù)類型不僅擁有新定所定義的新的數(shù)據(jù)類型不僅擁有新定義的成員,而且還同時擁有舊的成員。義的成員,而且還同時擁有舊的成員。5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用9在建立派生類的過程中,基類不會做任何改變;在建立派生類的過程中,基類不會做任何改變;派生類則除了繼承基類的所有可引用的成員變量派生類則除了繼承基類的所有可引用的成員變量和成員函數(shù)外,還

7、可另外定義本身的成員變量和和成員函數(shù)外,還可另外定義本身的成員變量和處理這些變量的函數(shù)處理這些變量的函數(shù)由于派生類可繼承基類的成員變量和成員函數(shù),由于派生類可繼承基類的成員變量和成員函數(shù),因此在基類中定義好的數(shù)據(jù)和函數(shù)等的程序代碼因此在基類中定義好的數(shù)據(jù)和函數(shù)等的程序代碼可重復(fù)使用,這樣可以提高程序的可靠性??芍貜?fù)使用,這樣可以提高程序的可靠性。5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用10當(dāng)從已有的類中派生出新的類時,可以對派生類做當(dāng)從已有的類中派生出新的類時,可以對派生類做以下幾種變化:以下幾種變化:1、 可以繼承基類的成員數(shù)據(jù)或成員函數(shù)??梢岳^承基類的成員數(shù)據(jù)或成員函數(shù)

8、。2、可以增加新的成員變量。、可以增加新的成員變量。3、可以增加新的成員函數(shù)。、可以增加新的成員函數(shù)。4、可以重新定義已有的成員函數(shù)。、可以重新定義已有的成員函數(shù)。5、可以改變現(xiàn)有的成員屬性。、可以改變現(xiàn)有的成員屬性。5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用11類類A派生類派生類B:類:類A為基類,類為基類,類B為派生類。為派生類。AB 但派生并不是簡單的擴(kuò)充,有可能改變派生類中的基類的但派生并不是簡單的擴(kuò)充,有可能改變派生類中的基類的成員性質(zhì)。成員性質(zhì)。 有三種派生方式:公有派生、保護(hù)派生、私有派生。有三種派生方式:公有派生、保護(hù)派生、私有派生。 默認(rèn)的是私有派生。默認(rèn)的

9、是私有派生。class B:public A.; class B:protected A.; class B:private A.; class B: A .; A為私有派生為私有派生5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式12從一個基類派生一個類的一般格式為:從一個基類派生一個類的一般格式為:class ClassName:BaseClassName private: .; /私有成員說明私有成員說明 public: .; /公有成員說明公有成員說明 protected: .; /保護(hù)成員說明保護(hù)成員說明 派生類名派生類名基類名基類名繼承方式繼承方式public:

10、 表示公有基類表示公有基類private:表示私有基類表示私有基類(默認(rèn)默認(rèn))protected:表示保護(hù)基類表示保護(hù)基類派生類中新增加的成員派生類中新增加的成員5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式13公有派生class ClassName: public BaseClassName公有派生時,公有派生時,基類中所有成員在派生類中保持各個成員基類中所有成員在派生類中保持各個成員的訪問權(quán)限的訪問權(quán)限。公有派生,派生類中保持公有派生,派生類中保持基類的成員特性基類的成員特性基類成員屬性基類成員屬性派生類中派生類中派生類外派生類外公有公有可以引用可以引用可以引用可以引

11、用保護(hù)保護(hù)可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式14x(私有私有)y(保護(hù)保護(hù))z(公有公有)Getx()Gety()ShowA()Ax(私私有私私有)y(保護(hù)保護(hù))z(公有公有)Getx()Gety()ShowA()Bm(私有私有)n(私有私有)B()Show()Sum()publicx在類在類B新增成員中不能直接調(diào)用新增成員中不能直接調(diào)用y在類在類B中可以調(diào)用中可以調(diào)用z在整個文件中可以調(diào)用在整個文件中可以調(diào)用對類對類B的對象初始化即是對的對象初始化即是對x,y,z,m,n等全部成員的初始

12、化等全部成員的初始化5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式15class A int x;protected: int y;public: int z; A(int a,int b,int c)x=a;y=b;z=c;/基類初始化基類初始化 int Getx( )return x;/返回返回x int Gety( )return y;/返回返回y void ShowA( )cout x=xty=ytz=zn;class B:public Aint m,n;public:B(int a,int b,int c,int d,int e):A(a,b,c)m=d;n=e

13、; void Show( )cout“m=mt“n=nn; coutx=Getx( )ty=ytz=zn; int Sum( )return ( Getx( )+y+z+m+n); ;void main( ) B b1(1,2,3,4,5); b1.ShowA( ); b1.Show( ); cout Sum=b1.Sum( )n;coutx=b1.Getx( )t; cout y= b1.Gety( )t; cout z=b1.zn;公有派生公有派生對基類初始化對基類初始化因為因為x是基類私有,所是基類私有,所以在派生類和類外中以在派生類和類外中不能直接引用不能直接引用因為因為y是基類保護(hù),

14、所以在是基類保護(hù),所以在派生類中可以直接引用。而派生類中可以直接引用。而在類外不可直接引用。在類外不可直接引用。因為因為z是基類公有,是基類公有,所以在派生類中和類所以在派生類中和類外均可直接引用。外均可直接引用。5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式僅對派生類中的新增成員僅對派生類中的新增成員進(jìn)行初始化進(jìn)行初始化16私有派生class ClassName: private BaseClassName此時,基類中公有成員和保護(hù)成員在派生類中均變?yōu)樗接校谂缮愔写藭r,基類中公有成員和保護(hù)成員在派生類中均變?yōu)樗接?,在派生類中仍可直接使用這些成員,仍可直接使用這些成員

15、,基類中的私有成員,在派生類中不可直接使用?;愔械乃接谐蓡T,在派生類中不可直接使用?;惓蓡T屬性基類成員屬性派生類派生類派生類外派生類外公有公有可以引用可以引用不可引用不可引用保護(hù)保護(hù)可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用基類:基類:public: (變?yōu)樗接凶優(yōu)樗接?在派生類中使用,類外不可使用在派生類中使用,類外不可使用protected: (變?yōu)樗接校┰谂缮愔惺褂?,類外不可使用變?yōu)樗接校┰谂缮愔惺褂茫愅獠豢墒褂胮rivate: 不能在派生類中和類外使用不能在派生類中和類外使用5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式17

16、x(私有私有)y(保護(hù)保護(hù))z(公有公有)Getx()Gety()ShowA()Ax(私私有私私有)y(私有私有)z(私有私有)Getx()Gety()ShowA()Bm(私有私有)n(私有私有)B()Show()Sum()privatex在類在類B新增加的成員中新增加的成員中不能直接調(diào)用不能直接調(diào)用y在類在類B中可以調(diào)用中可以調(diào)用z在類在類B中可以調(diào)用中可以調(diào)用對類對類B的對象初始化即是對的對象初始化即是對x,y,z,m,n等全部成員的初始化等全部成員的初始化均為私均為私有類有類B 外不能外不能引用引用5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式18class A i

17、nt x;protected: int y;public: int z; A(int a,int b,int c)x=a;y=b;z=c;/基類初始化基類初始化 int Getx()return x;/返回返回x int Gety()return y;/返回返回y void ShowA()cout x=xty=ytz=zn;class B:private Aint m,n;public: B(int a,int b,int c,int d,int e):A(a,b,c)m=d;n=e; void Show()cout“m=mt“n=nn; coutx=Getx()ty=ytz=zn; int

18、Sum()return ( Getx()+y+z+m+n); ;void main(void) B b1(1,2,3,4,5); b1.ShowA(); b1.Show(); cout Sum=b1.Sum()n;coutx=b1.Getx()t; cout y= b1.Gety()t;cout z=b1.zn;私有派生私有派生對基類初始化對基類初始化因為因為x是基類私有,所以在派生類和類外中不能直接引用是基類私有,所以在派生類和類外中不能直接引用y是基類保護(hù),所以在派生類是基類保護(hù),所以在派生類中可以直接引用。而在類外不中可以直接引用。而在類外不可直接引用??芍苯右?。z是基類公有,私有是基

19、類公有,私有派生變?yōu)樗接?,所以派生變?yōu)樗接校栽谂缮愔锌芍苯右谂缮愔锌芍苯右?,用,而在類外不可。而在類外不可。這些函數(shù)都是基類公有,這些函數(shù)都是基類公有,在類外不可使用。在類外不可使用。A a1(1,2,3); a1.ShowA();19保護(hù)派生class ClassName: protected BaseClassName此時,基類中公有和保護(hù)成員在派生類中均變?yōu)楸Wo(hù)的,在派生類中仍此時,基類中公有和保護(hù)成員在派生類中均變?yōu)楸Wo(hù)的,在派生類中仍可直接使用這些成員,可直接使用這些成員,基類中的私有成員,在派生類中不可直接使用。基類中的私有成員,在派生類中不可直接使用。基類成員屬性基類

20、成員屬性派生類派生類派生類外派生類外公有公有可以引用可以引用不可引用不可引用保護(hù)保護(hù)可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用基類:基類:public: (變?yōu)楸Wo(hù)變?yōu)楸Wo(hù))在派生類中使用,類外不可使用在派生類中使用,類外不可使用protected: (仍為保護(hù))在派生類中使用,類外不可使用仍為保護(hù))在派生類中使用,類外不可使用private: 不能在派生類中和類外使用不能在派生類中和類外使用5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式20 x(私有私有)y(保護(hù)保護(hù))z(公有公有)Getx()Gety()ShowA()Ax(私私有私私有)

21、y(保護(hù)保護(hù))z(保護(hù)保護(hù))Getx()Gety()ShowA()Bm(私有私有)n(私有私有)B()Show()Sum()protectedx在類在類B新增加的成員中不新增加的成員中不能直接調(diào)用能直接調(diào)用y在類在類B中可以調(diào)用中可以調(diào)用z在類在類B中可以調(diào)用中可以調(diào)用對類對類B的對象初始化即是對的對象初始化即是對x,y,z,m,n等全部成員的初始化等全部成員的初始化均為保護(hù)均為保護(hù)類類B 外不外不能引用能引用5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式21protected 成員是一種具有血緣關(guān)系內(nèi)外有別的成成員是一種具有血緣關(guān)系內(nèi)外有別的成員。員。它對派生類的對象而

22、言,是公開成員,可以訪問,它對派生類的對象而言,是公開成員,可以訪問,對對血緣外部而言,與私有成員一樣被隱蔽血緣外部而言,與私有成員一樣被隱蔽。5.2 三種繼承的派生類的成員訪問方式三種繼承的派生類的成員訪問方式22 當(dāng)定義了一個類,當(dāng)定義了一個類,這個類這個類只能用作基類只能用作基類來派生出來派生出新的類,而不能用這種類來定義對象時,稱這種新的類,而不能用這種類來定義對象時,稱這種類為抽象類。類為抽象類。 當(dāng)對某些特殊的對象要進(jìn)行很好地封裝時,需要當(dāng)對某些特殊的對象要進(jìn)行很好地封裝時,需要定義抽象類。定義抽象類。 將類的構(gòu)造函數(shù)或析構(gòu)函數(shù)的訪問權(quán)限定義為將類的構(gòu)造函數(shù)或析構(gòu)函數(shù)的訪問權(quán)限定義

23、為保保護(hù)護(hù)的時,這種類為的時,這種類為抽象類抽象類。5.3 抽象類與保護(hù)的成員函數(shù)抽象類與保護(hù)的成員函數(shù)23當(dāng)把類中的構(gòu)造函數(shù)或析構(gòu)函數(shù)說明為當(dāng)把類中的構(gòu)造函數(shù)或析構(gòu)函數(shù)說明為私有私有的時,的時,所定義的類通常是沒有任何實用意義的,一般情況所定義的類通常是沒有任何實用意義的,一般情況下,不能用它來產(chǎn)生對象,也不能用它來產(chǎn)生派生下,不能用它來產(chǎn)生對象,也不能用它來產(chǎn)生派生類。類。 5.3 抽象類與保護(hù)的成員函數(shù)抽象類與保護(hù)的成員函數(shù)24x(私有私有)y(私有私有)A( )(保護(hù)保護(hù))ShowA()(公有公有)Ax(私私有私私有)y(私私有私私有)A( )(保護(hù)保護(hù))ShowA()Bm(私有私有)

24、B()Show()public在類在類B中不能定義中不能定義A的對象的對象在任何時候都不能定義在任何時候都不能定義A的對象的對象但可以在初始化類但可以在初始化類B的對象時初始化的對象時初始化原類原類A中的成員中的成員,因為,因為A()在類在類B中是可以被調(diào)用的。中是可以被調(diào)用的。5.3 抽象類與保護(hù)的成員函數(shù)抽象類與保護(hù)的成員函數(shù)25class A int x, y;protected: A(int a,int b) x=a; y=b;/基類初始化基類初始化public:void ShowA( )cout x=xty=yn;class B: public Aint m;A a1;/在派生類中也

25、不可以定義在派生類中也不可以定義A的對象,實際上還是類外調(diào)用的對象,實際上還是類外調(diào)用public: B(int a,int b,int c):A(a,b)/可以在派生類中調(diào)用可以在派生類中調(diào)用A的構(gòu)造函數(shù)的構(gòu)造函數(shù) m=c; void Show( ) cout“m=mn; ShowA(); ;void main( ) B b1(1,2,3); /可以定義派生類對象可以定義派生類對象 b1.Show( ); A aa;/不可定義不可定義A的對象的對象 a1(4,5)5.3 抽象類與保護(hù)的成員函數(shù)抽象類與保護(hù)的成員函數(shù)26可以用多個基類來派生一個類。可以用多個基類來派生一個類。ABCD多重繼承是

26、單多重繼承是單一繼承的擴(kuò)展一繼承的擴(kuò)展派生類中新定派生類中新定義的成員義的成員5.4 多重繼承多重繼承27格式為:格式為:class 類名類名:類名類名1,., 類名類名n private: . ; /私有成員說明私有成員說明; public: . ; /公有成員說明公有成員說明; protected: . ; /保護(hù)的成員說明保護(hù)的成員說明;繼承方式繼承方式class D: public A, protected B, private C ./派生類中新增加成員派生類中新增加成員;5.4 多重繼承多重繼承28class A int x1,y1;public: A(int a,int b) x

27、1=a; y1=b;void ShowA(void) coutA.x=x1tA.y=y1endl; ;class Bint x2,y2;public: B(int a,int b)x2=a; y2=b; void ShowB( ) coutB.x=x2tB.y=y2endl; ;class C:public A,private Bint x,y;public: C(int a,int b,int c,int d,int e,int f):A(a,b),B(c,d)x=e; y=f; void ShowC( )coutC.x=xtC.y=yendl;ShowA();ShowB();void ma

28、in( )C c(1,2,3,4,5,6);c.ShowC();c.ShowA ();c.ShowB (); 公有派生公有派生私有派生私有派生仍為公有仍為公有成為私有成為私有非法,私有類外不可調(diào)用非法,私有類外不可調(diào)用B b1(10,20);b1.ShowB();29由于構(gòu)造函數(shù)不能被繼承由于構(gòu)造函數(shù)不能被繼承,故故派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)必須調(diào)用基類的構(gòu)造函數(shù)必須調(diào)用基類的構(gòu)造函數(shù)來初始化基類成員和基來初始化基類成員和基類類子對象子對象。若派生類中含有子對象,則派生類構(gòu)造函若派生類中含有子對象,則派生類構(gòu)造函數(shù)的調(diào)用順序如下:數(shù)的調(diào)用順序如下:基類的構(gòu)造函數(shù)基類的構(gòu)造函數(shù)子對象類的構(gòu)

29、造函數(shù)子對象類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)5.5 有子對象的派生類的構(gòu)造函數(shù)有子對象的派生類的構(gòu)造函數(shù)30class B:public A int y; A a1;public: B(int a, int b):A(a),a1(3)y=b; .;當(dāng)撤銷派生類對象時,析構(gòu)函當(dāng)撤銷派生類對象時,析構(gòu)函數(shù)的調(diào)用正好相反。數(shù)的調(diào)用正好相反?;惖臉?gòu)造函數(shù)基類的構(gòu)造函數(shù)子對象類的構(gòu)造函數(shù)子對象類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)5.5 有子對象的派生類的構(gòu)造函數(shù)有子對象的派生類的構(gòu)造函數(shù)基類成員構(gòu)造用基類名,基類成員構(gòu)造用基類名,基類子對象構(gòu)造用對象名基類子對象構(gòu)造用對象名基類成員

30、構(gòu)造基類成員構(gòu)造基類子對象構(gòu)造基類子對象構(gòu)造31class Base1 int x;public: Base1(int a)x=a;cout調(diào)用基類調(diào)用基類1的構(gòu)造函數(shù)的構(gòu)造函數(shù)!n;Base1( )cout調(diào)用基類調(diào)用基類1的析構(gòu)函數(shù)的析構(gòu)函數(shù)!n;class Base2 int y;public: Base2(int a)y=a;cout調(diào)用基類調(diào)用基類2的構(gòu)造函數(shù)的構(gòu)造函數(shù)!n;Base2( )cout調(diào)用基類調(diào)用基類2的析構(gòu)函數(shù)的析構(gòu)函數(shù)!n;class Derived:public Base2, public Base1int z;public: Derived(int a,int

31、b):Base1(a),Base2(20) z=b; cout調(diào)用派生類的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)!n;Derived( )cout調(diào)用派生類的析構(gòu)函數(shù)調(diào)用派生類的析構(gòu)函數(shù)!n;void main( )Derived c(100,200);調(diào)用基類調(diào)用基類2的構(gòu)造函數(shù)的構(gòu)造函數(shù)調(diào)用基類調(diào)用基類1的構(gòu)造函數(shù)的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)調(diào)用派生類的析構(gòu)函數(shù)調(diào)用派生類的析構(gòu)函數(shù)調(diào)用基類調(diào)用基類1的析構(gòu)函數(shù)的析構(gòu)函數(shù)調(diào)用基類調(diào)用基類2的析構(gòu)函數(shù)的析構(gòu)函數(shù)先說明基類先說明基類25.5 有子對象的派生類的構(gòu)造函數(shù)有子對象的派生類的構(gòu)造函數(shù)32class Derived:publi

32、c Base2, public Base1int z; Base1 b1,b2; public: Derived(int a,int b):Base1(a),Base2(20), b1(200),b2(a+b) z=b; cout調(diào)用派生類的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)!n; Derived( )cout調(diào)用派生類的析構(gòu)函數(shù)調(diào)用派生類的析構(gòu)函數(shù)!n;void main( )Derived c(100,200);基類子對象基類子對象基類成員構(gòu)造基類成員構(gòu)造基類子對象構(gòu)造基類子對象構(gòu)造基類成員構(gòu)造用基類名,基類成員構(gòu)造用基類名,基類子對象構(gòu)造用對象名基類子對象構(gòu)造用對象名5.5 有子對象的派生類的

33、構(gòu)造函數(shù)有子對象的派生類的構(gòu)造函數(shù)33class Base1 int x;public: Base1(int a)x=a;cout調(diào)用基類調(diào)用基類1的構(gòu)造函數(shù)的構(gòu)造函數(shù)!n;Base1( )cout調(diào)用基類調(diào)用基類1的析構(gòu)函數(shù)的析構(gòu)函數(shù)!n;class Base2 int y;public: Base2(int a)y=a;cout調(diào)用基類調(diào)用基類2的構(gòu)造函數(shù)的構(gòu)造函數(shù)!n;Base2( )cout調(diào)用基類調(diào)用基類2的析構(gòu)函數(shù)的析構(gòu)函數(shù)!n;class Derived:public Base2, public Base1int z; Base1 b1,b2; public: Derived(i

34、nt a,int b):Base1(a),Base2(20), b1(200),b2(a+b) z=b; cout調(diào)用派生類的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)!n;Derived( )cout調(diào)用派生類的析構(gòu)函數(shù)調(diào)用派生類的析構(gòu)函數(shù)!n;void main( )Derived c(100,200);5.5 有子對象的派生類的構(gòu)造函數(shù)有子對象的派生類的構(gòu)造函數(shù)34調(diào)用基類調(diào)用基類2的構(gòu)造函數(shù)的構(gòu)造函數(shù)調(diào)用基類調(diào)用基類1的構(gòu)造函數(shù)的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)調(diào)用派生類的析構(gòu)函數(shù)調(diào)用派生類的析構(gòu)函數(shù)調(diào)用基類調(diào)用基類1的析構(gòu)函數(shù)的析構(gòu)函數(shù)調(diào)用基類調(diào)用基類2的析構(gòu)函數(shù)的析構(gòu)函數(shù)調(diào)用基類

35、調(diào)用基類1的構(gòu)造函數(shù)的構(gòu)造函數(shù)調(diào)用基類調(diào)用基類1的構(gòu)造函數(shù)的構(gòu)造函數(shù)調(diào)用基類調(diào)用基類1的析構(gòu)函數(shù)的析構(gòu)函數(shù)調(diào)用基類調(diào)用基類1的析構(gòu)函數(shù)的析構(gòu)函數(shù)說明基類說明基類1的對象的對象b1,b25.5 有子對象的派生類的構(gòu)造函數(shù)有子對象的派生類的構(gòu)造函數(shù)35沖突沖突ABCxxxDxxxD()dD v;v.x=5;public派生類對象派生類對象產(chǎn)生了沖突產(chǎn)生了沖突v.A:x=5;用類作用符限定用類作用符限定5.6 多重繼承引起的二義性多重繼承引起的二義性36class Apublic: int x; void Show()cout x=xn; A(int a=0)x=a;class Bpublic: i

36、nt x; void Show()cout x=xn; B(int a=0)x=a;class C:public A,public Bint y;public: void Setx(int a) x=a; /c1對象中有兩個對象中有兩個x成員成員 void Sety(int b)y=b; int Gety() return y;void main( )C c1;c1.Show(); /c1對象中有兩個對象中有兩個Show()函數(shù)函數(shù) 這時,可以利用這時,可以利用類作用類作用域符域符:來指明數(shù)據(jù)或函來指明數(shù)據(jù)或函數(shù)的來源。數(shù)的來源。如:如:A:x=a; c1.B:Show();5.6 多重繼承引

37、起的二義性多重繼承引起的二義性37支配規(guī)則支配規(guī)則AxDpublicxxD()基類成員基類成員派生類新派生類新增成員增成員D v;v.x=5;當(dāng)派生類中新增加的數(shù)據(jù)或函當(dāng)派生類中新增加的數(shù)據(jù)或函數(shù)與基類中原有的同名時,若數(shù)與基類中原有的同名時,若不加限制,則不加限制,則優(yōu)先調(diào)用派生類優(yōu)先調(diào)用派生類中的成員中的成員,即后面的覆蓋前面的即后面的覆蓋前面的。55.6 多重繼承引起的二義性多重繼承引起的二義性38class Apublic: int x;void Show()cout x=xn;class Bpublic: int y;void Show()cout y=yn;class C:publ

38、ic A,public Bpublic: int y; /類類B和類和類C均有均有y的成員的成員;void main( ) C c1; c1.x=100; c1.y=200;/給派生類中的給派生類中的y賦值賦值 c1.B:y=300; /給基類給基類B中的中的y賦值賦值 c1.A:Show(); c1.B:Show();/用作用域運(yùn)算符限定調(diào)用的函數(shù)用作用域運(yùn)算符限定調(diào)用的函數(shù) cout y=c1.yn;/輸出派生類中的輸出派生類中的y值值 cout y=c1.B:yn;/輸出基類輸出基類B中的中的y值值當(dāng)派生類中新增加的當(dāng)派生類中新增加的數(shù)據(jù)或函數(shù)與基類中數(shù)據(jù)或函數(shù)與基類中原有的同名時,若不

39、原有的同名時,若不加限制,則加限制,則優(yōu)先調(diào)用優(yōu)先調(diào)用派生類中的成員,派生類中的成員,即即后面的覆蓋前面的后面的覆蓋前面的。5.6 多重繼承引起的二義性多重繼承引起的二義性39class Apublic: int x;A(int a=0) x=a;class Bpublic: int y;B(int a=0) y=a;class C:public Aint z;B b1; A a1;public: C(int a,int b,int m):A(a),b1(b),a1(a+b) z=m; void Show( )coutx=xt;couty=b1.yt;coutx=zn;couta1.x=a1.

40、xendl; ;void main( )C c1(100,200,500); c1.Show(); xzShow()a1.xb1.yC的對象所占空間的對象所占空間從基類從基類A中繼承中繼承在類在類C中新說明中新說明在類在類C中新說明中新說明在類在類C中新說明中新說明在類在類C中新說明中新說明從基類從基類A中繼承中繼承新說明類新說明類A對象中的對象中的x5.6 多重繼承引起的二義性多重繼承引起的二義性40基類與對象成員基類與對象成員 任一基類在派生類中只能繼承一次,否則,會造成成員名任一基類在派生類中只能繼承一次,否則,會造成成員名的沖突的沖突 若在派生類中,確實要有二個以上基類的成員,若在派生

41、類中,確實要有二個以上基類的成員,則可用基則可用基類的二個對象作為派生類的成員。類的二個對象作為派生類的成員。 把一個類作為派生類的基類或把一個類的對象作為一個類把一個類作為派生類的基類或把一個類的對象作為一個類的成員,在使用上是有區(qū)別的:的成員,在使用上是有區(qū)別的:p 在派生類中可直接使用基類的成員(訪問權(quán)限允許的話),在派生類中可直接使用基類的成員(訪問權(quán)限允許的話),但要但要使用對象成員的成員時,必須在對象名后加上成員運(yùn)使用對象成員的成員時,必須在對象名后加上成員運(yùn)算符算符“.”和成員名和成員名。5.6 多重繼承引起的二義性多重繼承引起的二義性41例題:在平面上作兩個點(diǎn),連一直線,求直線

42、的長度和直例題:在平面上作兩個點(diǎn),連一直線,求直線的長度和直線中點(diǎn)的坐標(biāo)。要求如下:線中點(diǎn)的坐標(biāo)。要求如下: 基類為基類為Dot,有兩個公有數(shù)據(jù)成員,即平面上的坐標(biāo),有兩個公有數(shù)據(jù)成員,即平面上的坐標(biāo)(x,y),同時有構(gòu)造函數(shù)及打印函數(shù)。,同時有構(gòu)造函數(shù)及打印函數(shù)。 派生類為派生類為Line,有,有兩個基類兩個基類Dot對象對象,分別存放兩點(diǎn)的,分別存放兩點(diǎn)的坐標(biāo),同時,從坐標(biāo),同時,從基類繼承了一個基類繼承了一個Dot數(shù)據(jù)數(shù)據(jù),存放直線中,存放直線中點(diǎn)的坐標(biāo)。點(diǎn)的坐標(biāo)。5.7 應(yīng)用舉例應(yīng)用舉例xyDot(x,y)(構(gòu)造構(gòu)造)Dot(&dot)(拷貝拷貝)Show()Dot的對象空間的

43、對象空間x(中點(diǎn)中點(diǎn))y(中點(diǎn)中點(diǎn))Show()d1xyShow()d2xyShow()Line(dot1,dot2)Showl()Line對象對象空間空間從基從基類繼類繼承承基類基類對象對象425.7 應(yīng)用舉例應(yīng)用舉例43class Dotpublic: float x,y;Dot(float a=0,float b=0) x=a; y=b;void Show(void)coutx=xty=yendl;class Line:public DotDot d1,d2;public: Line(Dot dot1,Dot dot2):d1(dot1),d2(dot2) x=(d1.x+d2.x)/2

44、; y=(d1.x+d2.y)/2; void Showl( ) coutDot1: ; d1.Show(); coutDot2: ; d2.Show(); coutLength=sqrt(d1.x-d2.x)*(d1.x-d2.x)+(d1.y-d2.y)*(d1.y-d2.y); coutendl; coutCenter: x=xty=yendl; ;void main( ) float a,b; coutab; Dot dot1(a,b);/調(diào)用調(diào)用Dot的構(gòu)造函數(shù)的構(gòu)造函數(shù) coutab; Dot dot2(a,b); Line line(dot1,dot2); line.Showl(

45、);用坐標(biāo)初始化用坐標(biāo)初始化Dot對象對象在在Line中新說明的成員中新說明的成員對成員初始化對成員初始化x,y是繼承基類的成員是繼承基類的成員打印坐標(biāo)打印坐標(biāo)5.7 應(yīng)用舉例應(yīng)用舉例44基類基類對象對象派生類派生類對象對象賦值兼容規(guī)則,即相互之間能否賦值?賦值兼容規(guī)則,即相互之間能否賦值? 可以將派生類對象的值賦給基類對象。可以將派生類對象的值賦給基類對象。反之不行反之不行Base b;Derive d; b = d; 只是將從基類只是將從基類繼承來的成員繼承來的成員賦值。賦值。5.8 基類與派生類的轉(zhuǎn)換基類與派生類的轉(zhuǎn)換45Dot dot;Line line;Dot = line;Line

46、 = dot;非法非法xyDot(x,y)(構(gòu)造構(gòu)造)Dot(&dot)(拷貝拷貝)Show()x(中點(diǎn)中點(diǎn))y(中點(diǎn)中點(diǎn))Show()d1xyShow()d2xyShow()Line(dot1,dot2)Showl()Line對象空間對象空間從基從基類繼類繼承承基類基類對象對象Dot的對象空間的對象空間5.8 基類與派生類的轉(zhuǎn)換基類與派生類的轉(zhuǎn)換46可以將一個派生類對象的地址賦給基類的指針變量??梢詫⒁粋€派生類對象的地址賦給基類的指針變量。基類對象基類對象派生類對象派生類對象Base b;Derive d;Base *basep;basepbasep=&b;basepbase

47、p = &dbasep只能引用從基類只能引用從基類繼承來的成員。繼承來的成員。基類指針基類指針派生類對象派生類對象基類對象基類對象5.8 基類與派生類的轉(zhuǎn)換基類與派生類的轉(zhuǎn)換47派生類對象可以初始化基類的引用。派生類對象可以初始化基類的引用。Derive d;Base& basei=d;基類對象基類對象派生類對象派生類對象Base b;Derive d;別名別名baseibasei只能引用從基只能引用從基類繼承來的成員。類繼承來的成員。基類引用基類引用派生類對象派生類對象5.8 基類與派生類的轉(zhuǎn)換基類與派生類的轉(zhuǎn)換48class Apublic: int x;A(int a=0

48、) x=a;class Bpublic: int y;B(int a=0) y=a;class C:public A,public B int z;public: C(int a,int b,int m): A(a), B(b) z=m; void Show( )coutx=xt;couty=yt;coutz=zn;void main(void)A a1(100);B b1(200);C c1(10,20,50);couta1.x=a1.xendl;coutb1.y=b1.yendl;c1.Show();a1=c1; b1=c1;/派生類對象向基類對象賦值派生類對象向基類對象賦值couta1.

49、x=a1.xendl;coutb1.y=b1.yShow(); xyzC( )Show( )102050a1.x=100b1.y=200 x=10y=20z=50a1.x=10b1.y=20c1xA( )a1yB( )b11002001020錯誤!錯誤!49類類B 是類是類A的派生類的派生類xA()xA()yB()xA()zC()A類類B類類C類類dxD()xA()zC()yB()A()xD類類類類A拷貝拷貝類類C 是類是類A的派生類的派生類類類D 是類是類B和類和類C的派生類的派生類這樣,類這樣,類D中就有兩份類中就有兩份類A的拷貝的拷貝B類類C類類類類A拷貝拷貝5.9 虛基類虛基類50這種同一個公共的基類在這種同一個

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論