vc課件程序設計_第1頁
vc課件程序設計_第2頁
vc課件程序設計_第3頁
vc課件程序設計_第4頁
vc課件程序設計_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、3/12/20221Adv.2 (Chapter 14) Object-Oriented Software Development3/12/20222Adv2.1 派生與繼承派生與繼承v繼承繼承v基類基類v派生類派生類EmployeeManagerSalaryHourly3/12/20223派生類的定義派生類的定義v派生類的語法格式派生類的語法格式class : 基類名基類名private:/protected:/public: / ;3/12/20224v不同繼承方式下派生類成員的訪問不同繼承方式下派生類成員的訪問權限權限公有繼承公有繼承(public):保護繼承保護繼承(protected

2、):私有繼承私有繼承(private):3/12/20225vclass A: public C .;vclass A: protected C .;vclass A: private C .;public: int x;potected:int yprivate:int z; C.A1.從公有基類派生某個類時,基類的公有成員會成為派從公有基類派生某個類時,基類的公有成員會成為派生類的公有成員,基類的受保護成員成為派生類的受生類的公有成員,基類的受保護成員成為派生類的受保護成員。派生類永遠也不能直接訪問基類的私有成保護成員。派生類永遠也不能直接訪問基類的私有成員。員。2.從受保護的基類派生一個

3、類時,基類的公有成員和受從受保護的基類派生一個類時,基類的公有成員和受保護成員成為派生類的受保護成員。保護成員成為派生類的受保護成員。3.從私有基類派生一個類時,基類的公有成員和受保護從私有基類派生一個類時,基類的公有成員和受保護成員成為派生類的私有成員成員成為派生類的私有成員3/12/20226派生性質(zhì) 基類中訪問權限 派生類中訪問權限 Public Public Protected Protected Public Private 不可訪問 Public Private Protected Private Private Private 不可訪問 3/12/20227例程AboutClas

4、svclass Fathervprotected:vint a1;vprivate:vint a2;vpublic:vFather( );vvoid printFather( );vvoid printFather(Father & f);v;3/12/20228例程AboutClassvFather:Father( )va1=1;va2=2;vvvoid Father:printFather( )vcouta1 a2;vvvoid Father:printFather(Father & f)vcoutf.a1 f.a2;v3/12/20229例程AboutClassvclas

5、s Child:public Fathervprotected:vint b1;vprivate:vint b2;vpublic:vChild();vvoid printChild();v/void printFather(Father & f);vvoid printChild(Child & c);v;3/12/202210例程AboutClassvChild:Child()vb1=3;vb2=4;vvvoid Child:printChild()vcouta1:a1 ;v/couta2:a2 ;vcoutb1:b1 ;vcoutb2:b2 ;v3/12/202211例程A

6、boutClassvvoid Child:printChild(Child & c)vcouta1:c.a1 ;v/couta2:c.a2 ;vcoutb1:c.b1 ;vcoutb2:c.b2 ;v3/12/202212例程AboutClassv/void Child:printFather(Father & f)v/couta1:f.a1 ;v/coutf.a2;v/3/12/202213例程AboutClassvvoid main( ) vFather f1,f2;vChild c1,c2;vcoutendlHere is f1.printFather:endl;vf1.

7、printFather();vcoutendlHere is f1.printFather(f2):endl;vf1.printFather(f2);vcoutendlHere is c1.printChild:endl;vc1.printChild();vcoutendlHere is c1.printChild(c2):endl;vc1.printChild(c2);vcoutendlHere is c1.printFather:endl;vc1.printFather();vcoutendlHere is c1.printFather(f1):endl;vc1.printFather(f

8、1);vcoutendl;v /coutf1.a1; coutf1.a2;v /coutc1.a1; coutc1.a2;v /coutc1.b1; coutc1.b2;v3/12/202214ResultvHere is f1.printFather:v1 2vHere is f1.printFather(f2):v1 2vHere is c1.printChild:va1:1 b1:3 b2:4vHere is c1.printChild(c2):va1:1 b1:3 b2:4vHere is c1.printFather:v1 2vHere is c1.printFather(f1):v

9、1 23/12/202215例程AboutClassv目錄AboutClass下例程3/12/202216例程AboutClass2vclass Child: private Fathervprotected:vint b1;vprivate:vint b2;vpublic:vChild();vvoid printChild();v/void printFather(Father & f);vvoid printChild(Child & c);v;3/12/202217例程AboutClass2vclass Grandson: public Childvpublic:vvoi

10、d printGrandson();v;vvoid Grandson:printGrandson()v/couta1:a1 ;v/couta2:a2 ;vcoutb1:b1 ;v/coutb2:b2 ;v3/12/202218例程AboutClass2vvoid main( ) vFather f1,f2;vChild c1,c2;vGrandson g1;vcoutendlHere is f1.printFather:endl;vf1.printFather();vcoutendlHere is f1.printFather(f2):endl;vf1.printFather(f2);vcou

11、tendlHere is c1.printChild:endl;vc1.printChild();vcoutendlHere is c1.printChild(c2):endl;vc1.printChild(c2);3/12/202219例程AboutClass2v/coutendlHere is c1.printFather:endl;v/c1.printFather();v/coutendlHere is c1.printFather(f1):endl;v/c1.printFather(f1);vcoutendlHere is g1.printChild():endl;vg1.printC

12、hild();vcoutendlHere is g1.printChild(c2):endl;vg1.printChild(c2);vcoutendlHere is g1.printGrandson():endl;vg1.printGrandson();vcoutendl;v3/12/202220ResultvHere is f1.printFather:v1 2vHere is f1.printFather(f2):v1 2vHere is c1.printChild:va1:1 b1:3 b2:4vHere is c1.printChild(c2):va1:1 b1:3 b2:4vHere

13、 is g1.printChild():va1:1 b1:3 b2:4vHere is g1.printChild(c2):va1:1 b1:3 b2:4vHere is g1.printGrandson():vb1:33/12/202221例程AboutClass2v目錄AboutClass2下例程3/12/202222v例:例:class Employeepublic:string name;/.short department;class Manager:public Employeepublic:list group;short level;void print( ) const; ;

14、3/12/202223基類對象和派生類對象的關系基類對象和派生類對象的關系1.派生類的對象可作為其相應基類的派生類的對象可作為其相應基類的對象處理。對象處理。2.基類的對象不能自動成為派生類的基類的對象不能自動成為派生類的對象。對象。3.派生類指針變量可為基類指針變量派生類指針變量可為基類指針變量賦值;可以用顯式類型轉換把基類賦值;可以用顯式類型轉換把基類指針強制轉換為派生類指針。指針強制轉換為派生類指針。3/12/202224void f(Manager m1,Employee e1)list elist;elist.push_front(&m1);elist.push_front(

15、&11);3/12/202225void g(Manager mm, Employee ee)Employee *pe=&mm;Manager *pm=ⅇpm-level=2;pm=static_cast(pe);pm-level=2;3/12/202226v成員函數(shù)成員函數(shù)class Employeestring first_name,family_name;char middle_initial;Employee(string &n,int d) /public:void print()const;string full_name()constretu

16、rn first_name+ +middle_initial+ +family_name;/.;3/12/202227class Manager:public Employee/.public:void print( ) const;/.;3/12/202228v派生類的成員函數(shù)可訪問基類的符派生類的成員函數(shù)可訪問基類的符合訪問權限的成員,也可重載基類合訪問權限的成員,也可重載基類的成員函數(shù)。(但不能訪問基類私的成員函數(shù)。(但不能訪問基類私有成員)有成員)void Manager:print( ) constEmployee:print( );/重名重名coutname is full_nam

17、e()n;3/12/202229構造函數(shù)和析構函數(shù)構造函數(shù)和析構函數(shù)v基類的構造和析構函數(shù)不會被繼承基類的構造和析構函數(shù)不會被繼承v當基類中聲明有缺省形式的構造函數(shù)或未聲明構造當基類中聲明有缺省形式的構造函數(shù)或未聲明構造函數(shù)時,派生類構造函數(shù)的聲明中可以省略對基類函數(shù)時,派生類構造函數(shù)的聲明中可以省略對基類構造函數(shù)的調(diào)用。構造函數(shù)的調(diào)用。v若基類中未聲明構造函數(shù),派生類也可以不聲明,若基類中未聲明構造函數(shù),派生類也可以不聲明,全部采用缺省形式構造函數(shù)。全部采用缺省形式構造函數(shù)。v當基類聲明有帶形參的構造函數(shù)時,派生類也應聲當基類聲明有帶形參的構造函數(shù)時,派生類也應聲明帶形參的構造函數(shù),提供將參

18、數(shù)傳遞給基類構造明帶形參的構造函數(shù),提供將參數(shù)傳遞給基類構造函數(shù)的途徑。函數(shù)的途徑。3/12/202230派生類構造和析構次序派生類構造和析構次序構造:基類構造:基類成員成員自身自身析構:自身析構:自身成員成員基類基類成員和基類的構造按類中聲明的次成員和基類的構造按類中聲明的次序,析構反序。序,析構反序。3/12/202231關于構造函數(shù)和析構函數(shù)的調(diào)用次序v#include iostream.hvclass basevpublic:vbase();vbase();v;3/12/202232關于構造函數(shù)和析構函數(shù)的調(diào)用次序v#include base.hvbase:base()vcoutbas

19、e construction!endl;vvbase:base()vcoutbase destruction!endl;v3/12/202233關于構造函數(shù)和析構函數(shù)的調(diào)用次序v#include base.hvclass self: public basevpublic:vself();vself();v;3/12/202234關于構造函數(shù)和析構函數(shù)的調(diào)用次序v#include self.hvself:self()vcoutself construction!endl;vvself:self()vcoutself destruction!endl;v3/12/202235關于構造函數(shù)和析構函數(shù)

20、的調(diào)用次序v#include self.hvclass child: public selfvpublic:vchild();vchild();v;3/12/202236關于構造函數(shù)和析構函數(shù)的調(diào)用次序v#include child.hvchild:child()vcoutchild construction!endl;vvchild:child()vcoutchild destruction!endl;v3/12/202237關于構造函數(shù)和析構函數(shù)的調(diào)用次序v#include child.hvvoid main()vchild c;v3/12/202238關于構造函數(shù)和析構函數(shù)的調(diào)用次序Re

21、sult(目錄InheritClass下程序)vbase construction!vself construction!vchild construction!vchild destruction!vself destruction!vbase destruction!3/12/202239多繼承多繼承基類與派生類的對應關系:基類與派生類的對應關系:v單繼承單繼承派生類只從一個基類派生派生類只從一個基類派生v多繼承多繼承派生類從多個基類派生派生類從多個基類派生v多重派生多重派生由一個基類派生出多個不同的派生類由一個基類派生出多個不同的派生類v多層派生多層派生派生類又作為基類,繼續(xù)派生新的類派

22、生類又作為基類,繼續(xù)派生新的類3/12/202240 多繼承時派生類的聲明:多繼承時派生類的聲明:vClass : , ,vvvv注意:每一個注意:每一個“繼承方式說明繼承方式說明”,只用于限,只用于限制對緊隨其后之基類的繼承。制對緊隨其后之基類的繼承。3/12/202241vclass Avpublic:v void setA(int);v void showA( );vprivate:v int a;v;vclass Bvpublic:v void setB(int);v void showB( );vprivate:v int b;v;vclass C: public A, privat

23、e Bvpublic:v void setC(int, int, int);v void showC( );vprivate:v int c;v;3/12/202242vvoid A:setA(int x)v a=x; vvoid B:setB(int x)v b=x; vvoid C:setC(intx, int y, int z)v/派生類成員直接訪問基類派生類成員直接訪問基類的公有成員的公有成員v SetA(x);v SetB(y);v c=z;vvvint main( )vv C obj;v obj.setA(5);v obj.showA( );v obj.setC(6, 7, 9);

24、v obj.showC( );v obj.setB(6); /錯誤錯誤v obj.showB( ); /錯誤錯誤v return 0;v3/12/202243Adv2.2 友元友元v友元函數(shù)友元函數(shù):v是在某類中說明的一個函數(shù),它不是該類的成員,但允許訪問該類的所有對象的私有成員和保護成員。v友元類友元類:v友元類為擴充類的接口提供了一種靈活的方法。3/12/202244例程AboutClass3vclass Myclassvprotected:vint a1;vprivate:vint a2;vpublic:vMyclass();vfriend void printMyclass();vfr

25、iend void printMyclass(Myclass m);v;3/12/202245例程AboutClass3vMyclass:Myclass()va1=1;va2=2;vv/void Myclass:printMyclass()v/couta1 a2;v/vvoid printMyclass()v/couta1 a2;v3/12/202246例程AboutClass3vvoid printMyclass(Myclass m)vcoutm.a1 m.a2;vvvoid main()vMyclass m1,m2;v/coutendlHere is m1.printMyclass(m2)

26、:endl;v/m1.printMyclass(m2);vcoutendlHere is printMyclass(m2):endl;vprintMyclass(m2);vcoutendl;v3/12/202247ResultvHere is printMyclass(m2):v1 23/12/202248例程AboutClass3v目錄AboutClass3下例程3/12/202249v友元雖然出現(xiàn)在類的說明中,但它不是類的成員函數(shù),所以沒有this指針。(目錄EQUALS下例程序)v友元說明可以出現(xiàn)在類的私有或公有部分,沒有區(qū)別。v友元可直接訪問對象的私有成員,省去調(diào)用類成員函數(shù)的開銷,但

27、破壞了類的封裝和數(shù)據(jù)隱藏,因此不能濫用友元。v可以將一個類說明為另一個類的友元。v友元關系不具有傳遞性和交換性。3/12/202250友元類友元類vclass Stack;vclass Nodev friend Stack;v int entry;v Node *next;v;3/12/202251Adv2.3 多態(tài)性多態(tài)性v當不同的對象收到相同的消息產(chǎn)生不同當不同的對象收到相同的消息產(chǎn)生不同的動作,這種功能稱為多態(tài)性。的動作,這種功能稱為多態(tài)性。vC+支持兩種多態(tài)性:靜態(tài)編譯時的多支持兩種多態(tài)性:靜態(tài)編譯時的多態(tài)性是通過函數(shù)重載實現(xiàn)的,運行時的態(tài)性是通過函數(shù)重載實現(xiàn)的,運行時的多態(tài)性則通過虛

28、函數(shù)來實現(xiàn)。多態(tài)性則通過虛函數(shù)來實現(xiàn)。3/12/202252虛函數(shù)虛函數(shù)vclass basevint a;vpublic:v void printbase( ) coutThis is class base: printbase.n;v virtual void vprint( ) coutThis is class base: virtual function vprint.n;v;vclass derived: public basevint b;vpublic:vvoid printbase( ) coutThis is class derived: printbase.n; v/ov

29、erwrite bases method.vvoid vprint( ) coutThis is class derived: virtual function vprint.n;vvoid others( ) coutprintbase();vp=&d; /convert from derived * to base * vp-printbase();v/not allowv/p-others();v/dynamic compilevp=&b;vp-vprint();vp=&d;vp-vprint();vThis is class derived: printbase.This is class derived: virtual function vprint.This is class base: printbase.This is class base: printbase.This is class base: virtual function vprint.This is class derived: virtual function vprint.3/12/202254虛

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論