




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第五章 繼承和派生類2繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)中最重要的機(jī)制。這種繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)中最重要的機(jī)制。這種機(jī)制機(jī)制提供了無(wú)限重復(fù)利用程序資源的一種途徑提供了無(wú)限重復(fù)利用程序資源的一種途徑。通過(guò)通過(guò)C+語(yǔ)言中的繼承機(jī)制,語(yǔ)言中的繼承機(jī)制,可以擴(kuò)充和完善舊的可以擴(kuò)充和完善舊的程序設(shè)計(jì)以適應(yīng)新的需求。程序設(shè)計(jì)以適應(yīng)新的需求。這樣不僅可以節(jié)省程序開(kāi)發(fā)的時(shí)間和資源,并且為這樣不僅可以節(jié)省程序開(kāi)發(fā)的時(shí)間和資源,并且為未來(lái)程序增添了新的資源。未來(lái)程序增添了新的資源。5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用3class Student int num; char name30; ch
2、ar sex; public: void display( ) /對(duì)成員函數(shù)對(duì)成員函數(shù)display的定義的定義 coutnum: numendl; coutname: nameendl; coutsex: sexendl; ;5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用4class Studend1 int num; /此行原來(lái)己有此行原來(lái)己有 char name20; /此行原來(lái)己有此行原來(lái)己有 char sex; /此行原來(lái)己有此行原來(lái)己有 int age; char addr20; public: void display( ) ; /此行原來(lái)己有此行原來(lái)己有 cout
3、num: numendl; /此行原來(lái)己有此行原來(lái)己有 coutname: nameendl;/此行原來(lái)己有此行原來(lái)己有 coutsex: sexendl; /此行原來(lái)己有此行原來(lái)己有 coutage: ageendl; coutaddress: addrendl; ; 5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用5利用原來(lái)定義的類利用原來(lái)定義的類StudentStudent作為基礎(chǔ),再加上新的作為基礎(chǔ),再加上新的內(nèi)容即可,以減少重復(fù)的工作量。內(nèi)容即可,以減少重復(fù)的工作量。 C+C+提供的繼提供的繼承機(jī)制就是為了解決這個(gè)問(wèn)題。承機(jī)制就是為了解決這個(gè)問(wèn)題。 在在C+中所謂中所謂“
4、繼承繼承”就是在一個(gè)已存在的類的基就是在一個(gè)已存在的類的基礎(chǔ)上建立一個(gè)新的類。礎(chǔ)上建立一個(gè)新的類。已存在的類稱為已存在的類稱為“基類基類(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+語(yǔ)言中,語(yǔ)言中,一個(gè)派生類可以從一個(gè)基類派生,一個(gè)派生類可以從一個(gè)基類派生,也可以從多個(gè)基類派生。也可以從多個(gè)基類派生。從一個(gè)基類派生的繼承稱為單繼承;從
6、一個(gè)基類派生的繼承稱為單繼承;從二個(gè)或多個(gè)基類派生的繼承稱為多重繼承。從二個(gè)或多個(gè)基類派生的繼承稱為多重繼承。通過(guò)繼承機(jī)制,可以利用已有的數(shù)據(jù)類型來(lái)定義新通過(guò)繼承機(jī)制,可以利用已有的數(shù)據(jù)類型來(lái)定義新的數(shù)據(jù)類型。的數(shù)據(jù)類型。所定義的新的數(shù)據(jù)類型不僅擁有新定所定義的新的數(shù)據(jù)類型不僅擁有新定義的成員,而且還同時(shí)擁有舊的成員。義的成員,而且還同時(shí)擁有舊的成員。5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用9在建立派生類的過(guò)程中,基類不會(huì)做任何改變;在建立派生類的過(guò)程中,基類不會(huì)做任何改變;派生類則除了繼承基類的所有可引用的成員變量派生類則除了繼承基類的所有可引用的成員變量和成員函數(shù)外,還
7、可另外定義本身的成員變量和和成員函數(shù)外,還可另外定義本身的成員變量和處理這些變量的函數(shù)處理這些變量的函數(shù)由于派生類可繼承基類的成員變量和成員函數(shù),由于派生類可繼承基類的成員變量和成員函數(shù),因此在基類中定義好的數(shù)據(jù)和函數(shù)等的程序代碼因此在基類中定義好的數(shù)據(jù)和函數(shù)等的程序代碼可重復(fù)使用,這樣可以提高程序的可靠性??芍貜?fù)使用,這樣可以提高程序的可靠性。5.1 派生和繼承的相關(guān)概念和作用派生和繼承的相關(guān)概念和作用10當(dāng)從已有的類中派生出新的類時(shí),可以對(duì)派生類做當(dāng)從已有的類中派生出新的類時(shí),可以對(duì)派生類做以下幾種變化:以下幾種變化: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 但派生并不是簡(jiǎn)單的擴(kuò)充,有可能改變派生類中的基類的但派生并不是簡(jiǎn)單的擴(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 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式12從一個(gè)基類派生一個(gè)類的一般格式為:從一個(gè)基類派生一個(gè)類的一般格式為:class ClassName:BaseClassName private: .; /私有成員說(shuō)明私有成員說(shuō)明 public: .; /公有成員說(shuō)明公有成員說(shuō)明 protected: .; /保護(hù)成員說(shuō)明保護(hù)成員說(shuō)明 派生類名派生類名基類名基類名繼承方式繼承方式public:
10、 表示公有基類表示公有基類private:表示私有基類表示私有基類(默認(rèn)默認(rèn))protected:表示保護(hù)基類表示保護(hù)基類派生類中新增加的成員派生類中新增加的成員5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式13公有派生class ClassName: public BaseClassName公有派生時(shí),公有派生時(shí),基類中所有成員在派生類中保持各個(gè)成員基類中所有成員在派生類中保持各個(gè)成員的訪問(wèn)權(quán)限的訪問(wèn)權(quán)限。公有派生,派生類中保持公有派生,派生類中保持基類的成員特性基類的成員特性基類成員屬性基類成員屬性派生類中派生類中派生類外派生類外公有公有可以引用可以引用可以引用可以引
11、用保護(hù)保護(hù)可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式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在整個(gè)文件中可以調(diào)用在整個(gè)文件中可以調(diào)用對(duì)類對(duì)類B的對(duì)象初始化即是對(duì)的對(duì)象初始化即是對(duì)x,y,z,m,n等全部成員的初始
12、化等全部成員的初始化5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式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;公有派生公有派生對(duì)基類初始化對(duì)基類初始化因?yàn)橐驗(yàn)閤是基類私有,所是基類私有,所以在派生類和類外中以在派生類和類外中不能直接引用不能直接引用因?yàn)橐驗(yàn)閥是基類保護(hù),
14、所以在是基類保護(hù),所以在派生類中可以直接引用。而派生類中可以直接引用。而在類外不可直接引用。在類外不可直接引用。因?yàn)橐驗(yàn)閦是基類公有,是基類公有,所以在派生類中和類所以在派生類中和類外均可直接引用。外均可直接引用。5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式僅對(duì)派生類中的新增成員僅對(duì)派生類中的新增成員進(jìn)行初始化進(jìn)行初始化16私有派生class ClassName: private BaseClassName此時(shí),基類中公有成員和保護(hù)成員在派生類中均變?yōu)樗接校谂缮愔写藭r(shí),基類中公有成員和保護(hù)成員在派生類中均變?yōu)樗接?,在派生類中仍可直接使用這些成員,仍可直接使用這些成員
15、,基類中的私有成員,在派生類中不可直接使用?;愔械乃接谐蓡T,在派生類中不可直接使用?;惓蓡T屬性基類成員屬性派生類派生類派生類外派生類外公有公有可以引用可以引用不可引用不可引用保護(hù)保護(hù)可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用基類:基類:public: (變?yōu)樗接凶優(yōu)樗接?在派生類中使用,類外不可使用在派生類中使用,類外不可使用protected: (變?yōu)樗接校┰谂缮愔惺褂?,類外不可使用變?yōu)樗接校┰谂缮愔惺褂?,類外不可使用private: 不能在派生類中和類外使用不能在派生類中和類外使用5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式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)用對(duì)類對(duì)類B的對(duì)象初始化即是對(duì)的對(duì)象初始化即是對(duì)x,y,z,m,n等全部成員的初始化等全部成員的初始化均為私均為私有類有類B 外不能外不能引用引用5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式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;私有派生私有派生對(duì)基類初始化對(duì)基類初始化因?yàn)橐驗(yàn)閤是基類私有,所以在派生類和類外中不能直接引用是基類私有,所以在派生類和類外中不能直接引用y是基類保護(hù),所以在派生類是基類保護(hù),所以在派生類中可以直接引用。而在類外不中可以直接引用。而在類外不可直接引用。可直接引用。z是基類公有,私有是基
19、類公有,私有派生變?yōu)樗接?,所以派生變?yōu)樗接?,所以在派生類中可直接引在派生類中可直接引用,用,而在類外不可。而在類外不可。這些函數(shù)都是基類公有,這些函數(shù)都是基類公有,在類外不可使用。在類外不可使用。A a1(1,2,3); a1.ShowA();19保護(hù)派生class ClassName: protected BaseClassName此時(shí),基類中公有和保護(hù)成員在派生類中均變?yōu)楸Wo(hù)的,在派生類中仍此時(shí),基類中公有和保護(hù)成員在派生類中均變?yōu)楸Wo(hù)的,在派生類中仍可直接使用這些成員,可直接使用這些成員,基類中的私有成員,在派生類中不可直接使用?;愔械乃接谐蓡T,在派生類中不可直接使用?;惓蓡T屬性基類
20、成員屬性派生類派生類派生類外派生類外公有公有可以引用可以引用不可引用不可引用保護(hù)保護(hù)可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用基類:基類:public: (變?yōu)楸Wo(hù)變?yōu)楸Wo(hù))在派生類中使用,類外不可使用在派生類中使用,類外不可使用protected: (仍為保護(hù))在派生類中使用,類外不可使用仍為保護(hù))在派生類中使用,類外不可使用private: 不能在派生類中和類外使用不能在派生類中和類外使用5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式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)用對(duì)類對(duì)類B的對(duì)象初始化即是對(duì)的對(duì)象初始化即是對(duì)x,y,z,m,n等全部成員的初始化等全部成員的初始化均為保護(hù)均為保護(hù)類類B 外不外不能引用能引用5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式21protected 成員是一種具有血緣關(guān)系內(nèi)外有別的成成員是一種具有血緣關(guān)系內(nèi)外有別的成員。員。它對(duì)派生類的對(duì)象而
22、言,是公開(kāi)成員,可以訪問(wèn),它對(duì)派生類的對(duì)象而言,是公開(kāi)成員,可以訪問(wèn),對(duì)對(duì)血緣外部而言,與私有成員一樣被隱蔽血緣外部而言,與私有成員一樣被隱蔽。5.2 三種繼承的派生類的成員訪問(wèn)方式三種繼承的派生類的成員訪問(wèn)方式22 當(dāng)定義了一個(gè)類,當(dāng)定義了一個(gè)類,這個(gè)類這個(gè)類只能用作基類只能用作基類來(lái)派生出來(lái)派生出新的類,而不能用這種類來(lái)定義對(duì)象時(shí),稱這種新的類,而不能用這種類來(lái)定義對(duì)象時(shí),稱這種類為抽象類。類為抽象類。 當(dāng)對(duì)某些特殊的對(duì)象要進(jìn)行很好地封裝時(shí),需要當(dāng)對(duì)某些特殊的對(duì)象要進(jìn)行很好地封裝時(shí),需要定義抽象類。定義抽象類。 將類的構(gòu)造函數(shù)或析構(gòu)函數(shù)的訪問(wèn)權(quán)限定義為將類的構(gòu)造函數(shù)或析構(gòu)函數(shù)的訪問(wèn)權(quán)限定義
23、為保保護(hù)護(hù)的時(shí),這種類為的時(shí),這種類為抽象類抽象類。5.3 抽象類與保護(hù)的成員函數(shù)抽象類與保護(hù)的成員函數(shù)23當(dāng)把類中的構(gòu)造函數(shù)或析構(gòu)函數(shù)說(shuō)明為當(dāng)把類中的構(gòu)造函數(shù)或析構(gòu)函數(shù)說(shuō)明為私有私有的時(shí),的時(shí),所定義的類通常是沒(méi)有任何實(shí)用意義的,一般情況所定義的類通常是沒(méi)有任何實(shí)用意義的,一般情況下,不能用它來(lái)產(chǎn)生對(duì)象,也不能用它來(lái)產(chǎn)生派生下,不能用它來(lái)產(chǎn)生對(duì)象,也不能用它來(lái)產(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的對(duì)象的對(duì)象在任何時(shí)候都不能定義在任何時(shí)候都不能定義A的對(duì)象的對(duì)象但可以在初始化類但可以在初始化類B的對(duì)象時(shí)初始化的對(duì)象時(shí)初始化原類原類A中的成員中的成員,因?yàn)?,因?yàn)锳()在類在類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的對(duì)象,實(shí)際上還是類外調(diào)用的對(duì)象,實(shí)際上還是類外調(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); /可以定義派生類對(duì)象可以定義派生類對(duì)象 b1.Show( ); A aa;/不可定義不可定義A的對(duì)象的對(duì)象 a1(4,5)5.3 抽象類與保護(hù)的成員函數(shù)抽象類與保護(hù)的成員函數(shù)26可以用多個(gè)基類來(lái)派生一個(gè)類??梢杂枚鄠€(gè)基類來(lái)派生一個(gè)類。ABCD多重繼承是
26、單多重繼承是單一繼承的擴(kuò)展一繼承的擴(kuò)展派生類中新定派生類中新定義的成員義的成員5.4 多重繼承多重繼承27格式為:格式為:class 類名類名:類名類名1,., 類名類名n private: . ; /私有成員說(shuō)明私有成員說(shuō)明; public: . ; /公有成員說(shuō)明公有成員說(shuō)明; protected: . ; /保護(hù)的成員說(shuō)明保護(hù)的成員說(shuō)明;繼承方式繼承方式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ù)來(lái)初始化基類成員和基來(lái)初始化基類成員和基類類子對(duì)象子對(duì)象。若派生類中含有子對(duì)象,則派生類構(gòu)造函若派生類中含有子對(duì)象,則派生類構(gòu)造函數(shù)的調(diào)用順序如下:數(shù)的調(diào)用順序如下:基類的構(gòu)造函數(shù)基類的構(gòu)造函數(shù)子對(duì)象類的構(gòu)
29、造函數(shù)子對(duì)象類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)5.5 有子對(duì)象的派生類的構(gòu)造函數(shù)有子對(duì)象的派生類的構(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)撤銷派生類對(duì)象時(shí),析構(gòu)函當(dāng)撤銷派生類對(duì)象時(shí),析構(gòu)函數(shù)的調(diào)用正好相反。數(shù)的調(diào)用正好相反。基類的構(gòu)造函數(shù)基類的構(gòu)造函數(shù)子對(duì)象類的構(gòu)造函數(shù)子對(duì)象類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)5.5 有子對(duì)象的派生類的構(gòu)造函數(shù)有子對(duì)象的派生類的構(gòu)造函數(shù)基類成員構(gòu)造用基類名,基類成員構(gòu)造用基類名,基類子對(duì)象構(gòu)造用對(duì)象名基類子對(duì)象構(gòu)造用對(duì)象名基類成員
30、構(gòu)造基類成員構(gòu)造基類子對(duì)象構(gòu)造基類子對(duì)象構(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ù)先說(shuō)明基類先說(shuō)明基類25.5 有子對(duì)象的派生類的構(gòu)造函數(shù)有子對(duì)象的派生類的構(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);基類子對(duì)象基類子對(duì)象基類成員構(gòu)造基類成員構(gòu)造基類子對(duì)象構(gòu)造基類子對(duì)象構(gòu)造基類成員構(gòu)造用基類名,基類成員構(gòu)造用基類名,基類子對(duì)象構(gòu)造用對(duì)象名基類子對(duì)象構(gòu)造用對(duì)象名5.5 有子對(duì)象的派生類的
33、構(gòu)造函數(shù)有子對(duì)象的派生類的構(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 有子對(duì)象的派生類的構(gòu)造函數(shù)有子對(duì)象的派生類的構(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ù)說(shuō)明基類說(shuō)明基類1的對(duì)象的對(duì)象b1,b25.5 有子對(duì)象的派生類的構(gòu)造函數(shù)有子對(duì)象的派生類的構(gòu)造函數(shù)35沖突沖突ABCxxxDxxxD()dD v;v.x=5;public派生類對(duì)象派生類對(duì)象產(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對(duì)象中有兩個(gè)對(duì)象中有兩個(gè)x成員成員 void Sety(int b)y=b; int Gety() return y;void main( )C c1;c1.Show(); /c1對(duì)象中有兩個(gè)對(duì)象中有兩個(gè)Show()函數(shù)函數(shù) 這時(shí),可以利用這時(shí),可以利用類作用類作用域符域符:來(lái)指明數(shù)據(jù)或函來(lái)指明數(shù)據(jù)或函數(shù)的來(lái)源。數(shù)的來(lái)源。如:如: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í),若數(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ù)與基類中原有的同名時(shí),若不
39、原有的同名時(shí),若不加限制,則加限制,則優(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的對(duì)象所占空間的對(duì)象所占空間從基類從基類A中繼承中繼承在類在類C中新說(shuō)明中新說(shuō)明在類在類C中新說(shuō)明中新說(shuō)明在類在類C中新說(shuō)明中新說(shuō)明在類在類C中新說(shuō)明中新說(shuō)明從基類從基類A中繼承中繼承新說(shuō)明類新說(shuō)明類A對(duì)象中的對(duì)象中的x5.6 多重繼承引起的二義性多重繼承引起的二義性40基類與對(duì)象成員基類與對(duì)象成員 任一基類在派生類中只能繼承一次,否則,會(huì)造成成員名任一基類在派生類中只能繼承一次,否則,會(huì)造成成員名的沖突的沖突 若在派生類中,確實(shí)要有二個(gè)以上基類的成員,若在派生
41、類中,確實(shí)要有二個(gè)以上基類的成員,則可用基則可用基類的二個(gè)對(duì)象作為派生類的成員。類的二個(gè)對(duì)象作為派生類的成員。 把一個(gè)類作為派生類的基類或把一個(gè)類的對(duì)象作為一個(gè)類把一個(gè)類作為派生類的基類或把一個(gè)類的對(duì)象作為一個(gè)類的成員,在使用上是有區(qū)別的:的成員,在使用上是有區(qū)別的:p 在派生類中可直接使用基類的成員(訪問(wèn)權(quán)限允許的話),在派生類中可直接使用基類的成員(訪問(wèn)權(quán)限允許的話),但要但要使用對(duì)象成員的成員時(shí),必須在對(duì)象名后加上成員運(yùn)使用對(duì)象成員的成員時(shí),必須在對(duì)象名后加上成員運(yùn)算符算符“.”和成員名和成員名。5.6 多重繼承引起的二義性多重繼承引起的二義性41例題:在平面上作兩個(gè)點(diǎn),連一直線,求直線
42、的長(zhǎng)度和直例題:在平面上作兩個(gè)點(diǎn),連一直線,求直線的長(zhǎng)度和直線中點(diǎn)的坐標(biāo)。要求如下:線中點(diǎn)的坐標(biāo)。要求如下: 基類為基類為Dot,有兩個(gè)公有數(shù)據(jù)成員,即平面上的坐標(biāo),有兩個(gè)公有數(shù)據(jù)成員,即平面上的坐標(biāo)(x,y),同時(shí)有構(gòu)造函數(shù)及打印函數(shù)。,同時(shí)有構(gòu)造函數(shù)及打印函數(shù)。 派生類為派生類為L(zhǎng)ine,有,有兩個(gè)基類兩個(gè)基類Dot對(duì)象對(duì)象,分別存放兩點(diǎn)的,分別存放兩點(diǎn)的坐標(biāo),同時(shí),從坐標(biāo),同時(shí),從基類繼承了一個(gè)基類繼承了一個(gè)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的對(duì)象空間的
43、對(duì)象空間x(中點(diǎn)中點(diǎn))y(中點(diǎn)中點(diǎn))Show()d1xyShow()d2xyShow()Line(dot1,dot2)Showl()Line對(duì)象對(duì)象空間空間從基從基類繼類繼承承基類基類對(duì)象對(duì)象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對(duì)象對(duì)象在在Line中新說(shuō)明的成員中新說(shuō)明的成員對(duì)成員初始化對(duì)成員初始化x,y是繼承基類的成員是繼承基類的成員打印坐標(biāo)打印坐標(biāo)5.7 應(yīng)用舉例應(yīng)用舉例44基類基類對(duì)象對(duì)象派生類派生類對(duì)象對(duì)象賦值兼容規(guī)則,即相互之間能否賦值?賦值兼容規(guī)則,即相互之間能否賦值? 可以將派生類對(duì)象的值賦給基類對(duì)象??梢詫⑴缮悓?duì)象的值賦給基類對(duì)象。反之不行反之不行Base b;Derive d; b = d; 只是將從基類只是將從基類繼承來(lái)的成員繼承來(lái)的成員賦值。賦值。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對(duì)象空間對(duì)象空間從基從基類繼類繼承承基類基類對(duì)象對(duì)象Dot的對(duì)象空間的對(duì)象空間5.8 基類與派生類的轉(zhuǎn)換基類與派生類的轉(zhuǎn)換46可以將一個(gè)派生類對(duì)象的地址賦給基類的指針變量??梢詫⒁粋€(gè)派生類對(duì)象的地址賦給基類的指針變量。基類對(duì)象基類對(duì)象派生類對(duì)象派生類對(duì)象Base b;Derive d;Base *basep;basepbasep=&b;basepbase
47、p = &dbasep只能引用從基類只能引用從基類繼承來(lái)的成員。繼承來(lái)的成員?;愔羔樆愔羔樑缮悓?duì)象派生類對(duì)象基類對(duì)象基類對(duì)象5.8 基類與派生類的轉(zhuǎn)換基類與派生類的轉(zhuǎn)換47派生類對(duì)象可以初始化基類的引用。派生類對(duì)象可以初始化基類的引用。Derive d;Base& basei=d;基類對(duì)象基類對(duì)象派生類對(duì)象派生類對(duì)象Base b;Derive d;別名別名baseibasei只能引用從基只能引用從基類繼承來(lái)的成員。類繼承來(lái)的成員?;愐没愐门缮悓?duì)象派生類對(duì)象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;/派生類對(duì)象向基類對(duì)象賦值派生類對(duì)象向基類對(duì)象賦值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錯(cuò)誤!錯(cuò)誤!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這種同一個(gè)公共的基類在這種同一個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西衛(wèi)生健康職業(yè)學(xué)院《金融風(fēng)險(xiǎn)分析師(FRM)專題(雙語(yǔ))》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江金融職業(yè)學(xué)院《供變電系統(tǒng)項(xiàng)目設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廈門(mén)工學(xué)院《計(jì)算機(jī)在林業(yè)中的應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南鐵道職業(yè)技術(shù)學(xué)院《生物化學(xué)實(shí)驗(yàn)A》2023-2024學(xué)年第二學(xué)期期末試卷
- 華北理工大學(xué)輕工學(xué)院《科研寫(xiě)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 齊魯醫(yī)藥學(xué)院《中外文化比較專題》2023-2024學(xué)年第二學(xué)期期末試卷
- 重慶對(duì)外經(jīng)貿(mào)學(xué)院《包裝材料及應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 醫(yī)院科室年度工作總結(jié)
- 母親六十歲生日宴會(huì)主持詞(7篇)
- 公司前臺(tái)的工作總結(jié)
- YY/T 0729.4-2009組織粘合劑粘接性能試驗(yàn)方法第4部分:傷口閉合強(qiáng)度
- GB/T 1040.3-2006塑料拉伸性能的測(cè)定第3部分:薄膜和薄片的試驗(yàn)條件
- GB 4706.20-2004家用和類似用途電器的安全滾筒式干衣機(jī)的特殊要求
- 血管“斑塊”的風(fēng)險(xiǎn)課件
- mks spectra介紹殘余氣體分析儀
- 腹腔鏡下闌尾切除術(shù)護(hù)理課件
- 《抖音生活服務(wù)服務(wù)商合作手冊(cè)》
- 中山大學(xué)抬頭信紙中山大學(xué)橫式便箋紙推薦信模板a
- 無(wú)形資產(chǎn)評(píng)估完整版課件
- 常暗之廂(7規(guī)則-簡(jiǎn)體修正)
- 制冷系統(tǒng)方案的設(shè)計(jì)pptx課件
評(píng)論
0/150
提交評(píng)論