C++備課講義第14章_第1頁(yè)
C++備課講義第14章_第2頁(yè)
C++備課講義第14章_第3頁(yè)
C++備課講義第14章_第4頁(yè)
C++備課講義第14章_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第第14章章 虛函數(shù)虛函數(shù)2虛函數(shù)虛函數(shù)多態(tài)性:多態(tài)性:調(diào)用同一個(gè)函數(shù)名,可以根據(jù)需要調(diào)用同一個(gè)函數(shù)名,可以根據(jù)需要但實(shí)現(xiàn)不同的功能。但實(shí)現(xiàn)不同的功能。多態(tài)性是面向?qū)ο蟮某绦蛟O(shè)計(jì)的關(guān)鍵技術(shù)。多態(tài)性是面向?qū)ο蟮某绦蛟O(shè)計(jì)的關(guān)鍵技術(shù)。編譯時(shí)的多態(tài)性(函數(shù)重載)編譯時(shí)的多態(tài)性(函數(shù)重載)運(yùn)行時(shí)的多態(tài)性運(yùn)行時(shí)的多態(tài)性(虛函數(shù))(虛函數(shù))多態(tài)性多態(tài)性運(yùn)行時(shí)的多態(tài)性是指在程序執(zhí)行之前,根據(jù)函數(shù)名和參數(shù)運(yùn)行時(shí)的多態(tài)性是指在程序執(zhí)行之前,根據(jù)函數(shù)名和參數(shù)無(wú)法確定應(yīng)該調(diào)用哪一個(gè)函數(shù),必須在程序的執(zhí)行過(guò)程中,無(wú)法確定應(yīng)該調(diào)用哪一個(gè)函數(shù),必須在程序的執(zhí)行過(guò)程中,根據(jù)具體的執(zhí)行情況來(lái)動(dòng)態(tài)地確定根據(jù)具體的執(zhí)行情況來(lái)動(dòng)態(tài)

2、地確定3可以將一個(gè)派生類對(duì)象的地址賦給基類的指針變可以將一個(gè)派生類對(duì)象的地址賦給基類的指針變量量?;悓?duì)象基類對(duì)象派生類對(duì)象派生類對(duì)象Base b;Derive d;Base *basep;basepbasep=&b;basepbasep = &d;basep只能引用從基只能引用從基類繼承來(lái)的成員。類繼承來(lái)的成員。xShow()xShow()yShow()basep -Show();basep-Show()基類指針基類指針派生類對(duì)象派生類對(duì)象基類對(duì)象基類對(duì)象4class Pointfloat x,y;public: Point()Point(float i,float j)x=

3、i;y=j;float area(void) return 0.0;const float Pi=3.14159;class Circle:public Point/類類Point的派生類的派生類float radius;public: Circle(float r)radius=r;float area(void) return Pi*radius*radius;void main(void) Point *pp; /基類指針,可以將派生類對(duì)象的地址賦給基類指針基類指針,可以將派生類對(duì)象的地址賦給基類指針 Circle c(5.4321); pp=&c; coutarea ()Sho

4、w()Base *basep;basep=&b;basep = &d;basep -Show();即指向派生類新增的成員函數(shù)即指向派生類新增的成員函數(shù)需要將基類中的需要將基類中的Show()說(shuō)明為虛函數(shù)說(shuō)明為虛函數(shù)6若要訪問(wèn)派生類中相同名字的函數(shù),必須將若要訪問(wèn)派生類中相同名字的函數(shù),必須將基類中的基類中的同名函數(shù)定義為虛函數(shù)同名函數(shù)定義為虛函數(shù),這樣,將,這樣,將不同的派生類對(duì)象的地址賦給基類的指針變不同的派生類對(duì)象的地址賦給基類的指針變量后,就可以量后,就可以動(dòng)態(tài)地根據(jù)這種賦值語(yǔ)句調(diào)用動(dòng)態(tài)地根據(jù)這種賦值語(yǔ)句調(diào)用不同類中的函數(shù)不同類中的函數(shù)。7class Point floa

5、t x,y;public: Point()Point(float i,float j)x=i;y=j;virtual float area(void) return 0.0; ;const float Pi=3.14159;class Circle:public Point/類類Point的派生類的派生類float radius;public: Circle(float r)radius=r;float area(void) return Pi*radius*radius;void main(void) Point *pp; /基類指針,可以將派生類對(duì)象的地址賦給基類指針基類指針,可以將派生類

6、對(duì)象的地址賦給基類指針 Circle c(5.4321); pp=&c; coutarea ()endl; /調(diào)用虛函數(shù)調(diào)用虛函數(shù)將將area()聲明為虛函數(shù),編譯器對(duì)其進(jìn)行動(dòng)態(tài)聚束,按照實(shí)際對(duì)象聲明為虛函數(shù),編譯器對(duì)其進(jìn)行動(dòng)態(tài)聚束,按照實(shí)際對(duì)象c調(diào)用了調(diào)用了Circle中的函數(shù)中的函數(shù)area()。使。使Point類中的類中的area()與與Circle類中的類中的area()有一個(gè)統(tǒng)一有一個(gè)統(tǒng)一的接口。的接口。輸出:輸出:92.7011聲明為虛函數(shù)聲明為虛函數(shù)調(diào)用虛函數(shù)調(diào)用虛函數(shù)虛函數(shù)再定義虛函數(shù)再定義8虛函數(shù)的定義和使用虛函數(shù)的定義和使用 可以在程序運(yùn)行時(shí)通過(guò)調(diào)用相同的函數(shù)名而實(shí)

7、可以在程序運(yùn)行時(shí)通過(guò)調(diào)用相同的函數(shù)名而實(shí)現(xiàn)不同功能的函數(shù)稱為虛函數(shù)?,F(xiàn)不同功能的函數(shù)稱為虛函數(shù)。定義格式為:定義格式為:virtual FuncName();一旦把基類的成員函數(shù)定義為虛函數(shù),由基類所一旦把基類的成員函數(shù)定義為虛函數(shù),由基類所派生出來(lái)的所有派生類中,該函數(shù)均保持虛函數(shù)派生出來(lái)的所有派生類中,該函數(shù)均保持虛函數(shù)的特性。的特性。 在派生類中重新定義基類中的虛函數(shù)時(shí),可以不在派生類中重新定義基類中的虛函數(shù)時(shí),可以不用關(guān)鍵字用關(guān)鍵字virtual來(lái)修飾這個(gè)成員函數(shù)來(lái)修飾這個(gè)成員函數(shù) 。9虛函數(shù)是用關(guān)鍵字虛函數(shù)是用關(guān)鍵字virtual修飾的某基類中的修飾的某基類中的protected或或

8、public成員函數(shù)。它可以在派生成員函數(shù)。它可以在派生類中重新定義,以形成不同版本。類中重新定義,以形成不同版本。只有在程只有在程序的執(zhí)行過(guò)程中,依據(jù)指針具體指向哪個(gè)類序的執(zhí)行過(guò)程中,依據(jù)指針具體指向哪個(gè)類對(duì)象,或依據(jù)引用哪個(gè)類對(duì)象,才能確定激對(duì)象,或依據(jù)引用哪個(gè)類對(duì)象,才能確定激活哪一個(gè)版本,實(shí)現(xiàn)動(dòng)態(tài)聚束活哪一個(gè)版本,實(shí)現(xiàn)動(dòng)態(tài)聚束。10class Aprotected:int x;public: A()x =1000; virtual void print()cout “x=”xt;/虛函數(shù)虛函數(shù);class B:public Aint y;public: B() y=2000;void

9、print()cout “y=”yt;/派生虛函數(shù)派生虛函數(shù);class C:public Aint z;public: C()z=3000;void print()cout “z=”zprint();/調(diào)用類調(diào)用類A的虛函數(shù)的虛函數(shù) pa=&b; pa-print();/調(diào)用類調(diào)用類B的虛函數(shù)的虛函數(shù) pa=&c; pa-print();/調(diào)用類調(diào)用類C的虛函數(shù)的虛函數(shù)x=1000y=2000z=3000 x=1000y=2000z=300011class Base public : virtual int Set(int a, int b) . .;class Derive

10、:public Basepublic : int Set(int x, int y) . .;class Base public : virtual int Set(int a, int b) . .;class Derive:public Basepublic : int Set(int x, int y=0) . .;int Set(int ,int )是虛函數(shù)是虛函數(shù)兩個(gè)兩個(gè)Set()函數(shù)參數(shù)函數(shù)參數(shù)不一致,是重載,不一致,是重載,不是虛函數(shù)不是虛函數(shù)12關(guān)于虛函數(shù),說(shuō)明以下幾點(diǎn):關(guān)于虛函數(shù),說(shuō)明以下幾點(diǎn):1、當(dāng)在基類中把成員函數(shù)定義為虛函數(shù)后,當(dāng)在基類中把成員函數(shù)定義為虛函數(shù)后,在其派

11、生類中定義的虛函數(shù)必須與基類中的在其派生類中定義的虛函數(shù)必須與基類中的虛函數(shù)同名,參數(shù)的類型、順序、參數(shù)的個(gè)虛函數(shù)同名,參數(shù)的類型、順序、參數(shù)的個(gè)數(shù)必須一一對(duì)應(yīng),函數(shù)的返回的類型也相同數(shù)必須一一對(duì)應(yīng),函數(shù)的返回的類型也相同。若函數(shù)名相同,但參數(shù)的個(gè)數(shù)不同或者參數(shù)若函數(shù)名相同,但參數(shù)的個(gè)數(shù)不同或者參數(shù)的類型不同時(shí),則屬于函數(shù)的重載,而不是的類型不同時(shí),則屬于函數(shù)的重載,而不是虛函數(shù)。若函數(shù)名不同,顯然這是不同的成虛函數(shù)。若函數(shù)名不同,顯然這是不同的成員函數(shù)。員函數(shù)。132、實(shí)現(xiàn)這種動(dòng)態(tài)的多態(tài)性時(shí),必須使用實(shí)現(xiàn)這種動(dòng)態(tài)的多態(tài)性時(shí),必須使用基類類型基類類型的指針變量或基類引用的指針變量或基類引用,并

12、使該指針或引用,并使該指針或引用指向指向不同的派生類對(duì)象不同的派生類對(duì)象,并通過(guò)調(diào)用指針或引用所指,并通過(guò)調(diào)用指針或引用所指向的虛函數(shù)才能實(shí)現(xiàn)動(dòng)態(tài)的多態(tài)性。向的虛函數(shù)才能實(shí)現(xiàn)動(dòng)態(tài)的多態(tài)性。xShow()xShow()yShow()xShow()zShow()類類A類類B類類CShow()定義為虛函數(shù)定義為虛函數(shù)類類B與類與類C均為類均為類A的公有派生。的公有派生。A *p; B b;C c; p=&b ; p-Show();p=&c ; p-Show();即在程序運(yùn)行時(shí),即在程序運(yùn)行時(shí),通過(guò)賦值語(yǔ)句實(shí)通過(guò)賦值語(yǔ)句實(shí)現(xiàn)多態(tài)性現(xiàn)多態(tài)性143、虛函數(shù)必須是類的一個(gè)成員函數(shù),不能是虛函

13、數(shù)必須是類的一個(gè)成員函數(shù),不能是友元函數(shù),也不能是靜態(tài)的成員函數(shù)。友元函數(shù),也不能是靜態(tài)的成員函數(shù)。4、在派生類中、在派生類中沒(méi)有重新定義虛函數(shù)沒(méi)有重新定義虛函數(shù)時(shí),與一時(shí),與一般的成員函數(shù)一樣,當(dāng)調(diào)用這種派生類對(duì)象般的成員函數(shù)一樣,當(dāng)調(diào)用這種派生類對(duì)象的虛函數(shù)時(shí),的虛函數(shù)時(shí),則調(diào)用其基類中的虛函數(shù)則調(diào)用其基類中的虛函數(shù)。5、可把析構(gòu)函數(shù)定義為虛函數(shù),但是,不能可把析構(gòu)函數(shù)定義為虛函數(shù),但是,不能將構(gòu)造函數(shù)定義為虛函數(shù)將構(gòu)造函數(shù)定義為虛函數(shù)。156、虛函數(shù)與一般的成員函數(shù)相比較,、虛函數(shù)與一般的成員函數(shù)相比較,調(diào)用時(shí)的執(zhí)調(diào)用時(shí)的執(zhí)行速度要慢一些行速度要慢一些。為了實(shí)現(xiàn)多態(tài)性,在每一個(gè)派。為了實(shí)

14、現(xiàn)多態(tài)性,在每一個(gè)派生類中均要保存相應(yīng)虛函數(shù)的入口地址表,函數(shù)生類中均要保存相應(yīng)虛函數(shù)的入口地址表,函數(shù)的調(diào)用機(jī)制也是間接實(shí)現(xiàn)的。因此,除了要編寫的調(diào)用機(jī)制也是間接實(shí)現(xiàn)的。因此,除了要編寫一些通用的程序,并一定要使用虛函數(shù)才能完成一些通用的程序,并一定要使用虛函數(shù)才能完成其功能要求外,通常不必使用虛函數(shù)。其功能要求外,通常不必使用虛函數(shù)。7、一個(gè)函數(shù)如果被定義成虛函數(shù),則不管經(jīng)歷多、一個(gè)函數(shù)如果被定義成虛函數(shù),則不管經(jīng)歷多少次派生,仍將保持其虛特性,以實(shí)現(xiàn)少次派生,仍將保持其虛特性,以實(shí)現(xiàn)“一個(gè)接一個(gè)接口,多個(gè)形態(tài)口,多個(gè)形態(tài)”。16虛函數(shù)的訪問(wèn)虛函數(shù)的訪問(wèn)用基類指針或基類引用訪問(wèn)與用派生類對(duì)

15、象用基類指針或基類引用訪問(wèn)與用派生類對(duì)象名訪問(wèn)名訪問(wèn)用基類指針或基類引用訪問(wèn)虛函數(shù)時(shí),指向用基類指針或基類引用訪問(wèn)虛函數(shù)時(shí),指向其實(shí)際派生類對(duì)象重新定義的函數(shù)。實(shí)現(xiàn)動(dòng)其實(shí)際派生類對(duì)象重新定義的函數(shù)。實(shí)現(xiàn)動(dòng)態(tài)聚束。態(tài)聚束。通過(guò)一個(gè)通過(guò)一個(gè)派生類對(duì)象名派生類對(duì)象名訪問(wèn)時(shí),只能靜態(tài)聚訪問(wèn)時(shí),只能靜態(tài)聚束。即由編譯器在編譯的時(shí)候決定調(diào)用哪個(gè)束。即由編譯器在編譯的時(shí)候決定調(diào)用哪個(gè)函數(shù)。函數(shù)。17class Point float x,y;public: Point()Point(float i,float j)x=i;y=j;virtual float area(void) return 0.0; /聲

16、明為虛函數(shù)聲明為虛函數(shù);const float Pi=3.14159;class Circle:public Point/類類Point的派生類的派生類float radius;public: Circle(float r)radius=r;float area(void) return Pi*radius*radius;/虛函數(shù)再定義虛函數(shù)再定義;void main(void) Point *pp; /基類指針,可以將派生類對(duì)象的地址賦給基類指針基類指針,可以將派生類對(duì)象的地址賦給基類指針 Circle c(5.4321); coutc.area()endl; coutc.Point:are

17、a()endl; coutc.Circle:area ()endl;輸出:輸出:92.7011092.7011可見,利用對(duì)象名進(jìn)行調(diào)用與一般非虛函數(shù)沒(méi)有區(qū)別??梢?,利用對(duì)象名進(jìn)行調(diào)用與一般非虛函數(shù)沒(méi)有區(qū)別。用對(duì)象名調(diào)用用對(duì)象名調(diào)用area( )18class base0public: void v(void)coutbase0n;class base1:public base0public: virtual void v(void) coutbase1n; ;class A1:public base1public: void v()coutA1n; ;class A2:public A1pub

18、lic: void v(void)coutA2n; ;class B1:private base1public: void v(void)coutB1n; ;class B2:public B1public: void v(void)coutv(); A2 a2; (pb=&a2)-v(); B1 b1; (pb=&b1)-v(); B2 b2; (pb=&b2)-v();base0base0私有派生,在類外私有派生,在類外不能調(diào)用基類函數(shù)不能調(diào)用基類函數(shù)19class base0public: void v(void)coutbase0n;class base1:pu

19、blic base0public: virtual void v(void) coutbase1n; ;class A1:public base1public: void v()coutA1n; ;class A2:public A1public: void v(void)coutA2n; ;class B1:private base1public: void v(void)coutB1n; ;class B2:public B1public: void v(void)coutv(); A2 a2; (pb=&a2)-v();A1A220下面程序的輸出是下面程序的輸出是 。class

20、Aprotected:int x;public:A()x =1000;virtual void p()cout x=xn; p2(); virtual void p2()coutA:p2()endl; ;class C:public Aint z;public:C()z=3000; void p()cout z=zn; p2();virtual void p2()coutC:p2()p();pa=&c;pa-p();x=1000z=3000C:p2()A:p2()21class B0class B0public:public: virtual void display()cout B0

21、:display()n; virtual void display()cout B0:display()n; ;class B1:public B0class B1:public B0public:public: void display()cout B1:display()n; void display()cout B1:display()n; ;class D:public B1class D:public B1public:public: void display()cout D:display()n; void display()cout display(); p-display();

22、 void main()void main() B0 b0, B0 b0, * *p; p; p = &b0; fun(p); p = &b0; fun(p); B1 b1; p = &b1; B1 b1; p = &b1; fun(p); fun(p); D d; p = &d; D d; p = &d; fun(p); fun(p); B0:display()B0:display()B1:display()B1:display()D:display()D:display()22class B0class B0public:public: vi

23、rtual void display()cout B0:display()n; virtual void display()cout B0:display()n; ;class B1:public B0class B1:public B0public:public: void display()cout B1:display()n; void display()cout B1:display()n; ;class D:public B1class D:public B1public:public: void display()cout D:display()n; void display()c

24、out D:display()n; ;void fun(void fun(B0 &bbB0 &bb) ) bb.display(); bb.display(); void main()void main() B0 b0; B0 b0; fun(b0); fun(b0); B1 b1; B1 b1; fun(b1); fun(b1); D d; D d; fun(d); fun(d); B0:display()B0:display()B1:display()B1:display()D:display()D:display()23純虛函數(shù)純虛函數(shù)在基類中不對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn)在

25、基類中不對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn),它只是它只是在派生類中有具體的意義。這時(shí)基類中的虛函數(shù)在派生類中有具體的意義。這時(shí)基類中的虛函數(shù)只是一個(gè)入口,具體的目的地由不同的派生類中只是一個(gè)入口,具體的目的地由不同的派生類中的對(duì)象決定。這個(gè)虛函數(shù)稱為的對(duì)象決定。這個(gè)虛函數(shù)稱為純虛函數(shù)純虛函數(shù)。class virtual ()=0;.;24class Aprotected:int x;public: A()x =1000; virtual void print()=0; /定義純虛函數(shù)定義純虛函數(shù);class B:public A /派生類派生類private: int y;public: B() y=2

26、000;void print()cout “y=”yn;/重新定義純虛函數(shù)重新定義純虛函數(shù);class C:public A /派生類派生類int z;public: C()z=3000;void print()cout “z=”zprint(); pa=&c; pa-print(); A a; pa=&a; pa-print( );y=2000z=3000抽象類抽象類不能定義抽象類的對(duì)象不能定義抽象類的對(duì)象251、在定義純虛函數(shù)時(shí),不能定義虛函數(shù)的實(shí)、在定義純虛函數(shù)時(shí),不能定義虛函數(shù)的實(shí)現(xiàn)部分。現(xiàn)部分。2、把函數(shù)名賦于、把函數(shù)名賦于0,本質(zhì)上是將指向函數(shù)體,本質(zhì)上是將指向函數(shù)

27、體的指針值賦為初值的指針值賦為初值0。與定義空函數(shù)不一樣,。與定義空函數(shù)不一樣,空函數(shù)的函數(shù)體為空,即調(diào)用該函數(shù)時(shí),不空函數(shù)的函數(shù)體為空,即調(diào)用該函數(shù)時(shí),不執(zhí)行任何動(dòng)作。執(zhí)行任何動(dòng)作。在沒(méi)有重新定義這種純虛函在沒(méi)有重新定義這種純虛函數(shù)之前,是不能調(diào)用這種函數(shù)的。數(shù)之前,是不能調(diào)用這種函數(shù)的。263、把至少包含一個(gè)純虛函數(shù)的類,稱為抽象把至少包含一個(gè)純虛函數(shù)的類,稱為抽象類。這種類只能作為派生類的基類,不能用類。這種類只能作為派生類的基類,不能用來(lái)說(shuō)明這種類的對(duì)象來(lái)說(shuō)明這種類的對(duì)象。其理由是明顯的:因?yàn)樘摵瘮?shù)沒(méi)有實(shí)現(xiàn)部分,其理由是明顯的:因?yàn)樘摵瘮?shù)沒(méi)有實(shí)現(xiàn)部分,所以不能產(chǎn)生對(duì)象。但可以定義指向抽

28、象類所以不能產(chǎn)生對(duì)象。但可以定義指向抽象類的指針,即指向這種基類的指針。當(dāng)用這種的指針,即指向這種基類的指針。當(dāng)用這種基類指針指向其派生類的對(duì)象時(shí),基類指針指向其派生類的對(duì)象時(shí),必須在派必須在派生類中生類中重載重載純虛函數(shù),否則會(huì)產(chǎn)生程序的運(yùn)純虛函數(shù),否則會(huì)產(chǎn)生程序的運(yùn)行錯(cuò)誤。行錯(cuò)誤。274、在以抽象類作為基類的派生類中必須有在以抽象類作為基類的派生類中必須有純虛函數(shù)的實(shí)現(xiàn)部分,即必須有重載純虛函純虛函數(shù)的實(shí)現(xiàn)部分,即必須有重載純虛函數(shù)的函數(shù)體。否則,這樣的派生類也是不能數(shù)的函數(shù)體。否則,這樣的派生類也是不能產(chǎn)生對(duì)象的。產(chǎn)生對(duì)象的。綜上所述,可把純虛函數(shù)歸結(jié)為:綜上所述,可把純虛函數(shù)歸結(jié)為:抽

29、象類的抽象類的唯一用途是為派生類提供基類,純虛函數(shù)的唯一用途是為派生類提供基類,純虛函數(shù)的作用是作為派生類中的成員函數(shù)的基礎(chǔ),并作用是作為派生類中的成員函數(shù)的基礎(chǔ),并實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性。實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性。28虛基類虛基類多基派生中的多條路徑具有公共基類時(shí),在這條路徑的匯合處就會(huì)多基派生中的多條路徑具有公共基類時(shí),在這條路徑的匯合處就會(huì)因?qū)不惍a(chǎn)生多個(gè)拷貝而產(chǎn)生同名函數(shù)調(diào)用的二義性。因?qū)不惍a(chǎn)生多個(gè)拷貝而產(chǎn)生同名函數(shù)調(diào)用的二義性。解決這個(gè)問(wèn)題的辦法就是把解決這個(gè)問(wèn)題的辦法就是把公共基類定義為虛基類公共基類定義為虛基類,使由它派生的,使由它派生的多條路徑的匯聚處只產(chǎn)生一個(gè)拷貝。多條路徑的匯聚處只

30、產(chǎn)生一個(gè)拷貝。class Base ;class A : public Base ;class B: public Base ;class C: public A, public B ;類類C中繼承了兩個(gè)類中繼承了兩個(gè)類Base,即有兩個(gè)類即有兩個(gè)類Base的實(shí)現(xiàn)部分,的實(shí)現(xiàn)部分,在調(diào)用時(shí)產(chǎn)生了二義性。在調(diào)用時(shí)產(chǎn)生了二義性。29用虛基類進(jìn)行多重派生時(shí),用虛基類進(jìn)行多重派生時(shí),若虛基類沒(méi)有缺若虛基類沒(méi)有缺省的構(gòu)造函數(shù)省的構(gòu)造函數(shù),則在每一個(gè)派生類的構(gòu)造函,則在每一個(gè)派生類的構(gòu)造函數(shù)中數(shù)中都必須有對(duì)虛基類構(gòu)造函數(shù)的調(diào)用都必須有對(duì)虛基類構(gòu)造函數(shù)的調(diào)用 (且(且首先調(diào)用)。首先調(diào)用)。由虛基類派生出的

31、對(duì)象初始化時(shí),由虛基類派生出的對(duì)象初始化時(shí),直接調(diào)用直接調(diào)用虛基類的構(gòu)造函數(shù)。因此,若將一個(gè)類定義虛基類的構(gòu)造函數(shù)。因此,若將一個(gè)類定義為虛基類,則一定有正確的構(gòu)造函數(shù)可供所為虛基類,則一定有正確的構(gòu)造函數(shù)可供所有派生類調(diào)用。有派生類調(diào)用。30class basepublic:virtual void a() couta() in basen;virtual void b() coutb() in basen;virtual void c() coutc() in basen;virtual void d() coutd() in basen;virtual void e() coute()

32、in basen;virtual void f() coutf() in basen;class A:public basepublic:virtual void a() couta() in An;virtual void b() coutb() in An;virtual void f() coutf() in An;class B:public basepublic:virtual void a() couta() in Bn;virtual void b() coutb() in Bn;virtual void c() coutc() in Bn;class C:public A,pu

33、blic Bpublic:virtual void a() couta() in Cn;virtual void d() couta(); pa-b(); pa-c(); pa-d(); pa-e(); pa-f();將類將類C的地址賦的地址賦值時(shí)產(chǎn)生歧義值時(shí)產(chǎn)生歧義31a( )b( )c( )d( )e( )f( )a( )b( )c( )d( )e( )f( )a( )b( )f( )a( )b( )c( )d( )e( )f( )a( )c( )a( )b( )c( )d( )e( )f( )a( )b( )f( )a( )b( )c( )d( )e( )f( )a( )c( )base

34、ABCa( )d( )AB32class basepublic:virtual void a() couta() in basen;virtual void b() coutb() in basen;virtual void c() coutc() in basen;virtual void d() coutd() in basen;virtual void e() coute() in basen;virtual void f() coutf() in basen;class A:public basepublic:virtual void a() couta() in An;virtual

35、 void b() coutb() in An;virtual void f() coutf() in An;class B:public basepublic:virtual void a() couta() in Bn;virtual void b() coutb() in Bn;virtual void c() coutc() in Bn;class C:public A,public Bpublic:virtual void a() couta() in Cn;virtual void d() couta(); pa-b(); pa-c(); pa-d(); pa-e(); pa-f(

36、);將類將類C的地址賦的地址賦值時(shí)產(chǎn)生歧義值時(shí)產(chǎn)生歧義類類C中有兩個(gè)中有兩個(gè)base,只有一個(gè),只有一個(gè)Aa() in Cb() in Ac() in based() in Ce() in basef() in A為避免這種情況,將為避免這種情況,將base定義定義為虛基類。為虛基類。33class basepublic:virtual void a() couta() in basen;virtual void b() coutb() in basen;virtual void c() coutc() in basen;virtual void d() coutd() in basen;vi

37、rtual void e() coute() in basen;virtual void f() coutf() in basen;class A:virtual public basepublic:virtual void a() couta() in An;virtual void b() coutb() in An;virtual void f() coutf() in An;class B:virtual public basepublic:virtual void a() couta() in Bn;virtual void c() coutc() in Bn;class C:public A,public Bpublic:virtual void a() couta() in Cn;virtual void d() couta(); pa-b(); pa-c(); pa-d(); pa-e(); pa-f();34a( )b( )c( )d( )e( )f( )a( )b( )c( )d( )e( )f( )a( )b( )f( )a( )b( )c( )d( )e( )

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論