版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、繼承與派生第1頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二本章主要內(nèi)容類的繼承與派生類成員的訪問控制單繼承與多繼承派生類的構(gòu)造、析構(gòu)函數(shù)類成員的標(biāo)識與訪問第2頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二7.1繼承概述 什么是繼承基類與派生類第3頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二類的繼承與派生保持已有類的特性而構(gòu)造新類的過程稱為繼承。在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生。被繼承的已有類稱為基類(或父類)。派生出的新類稱為派生類。第4頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二動物哺乳動物爬行動物馬狗工作型狗牧羊犬
2、寵物狗看家犬獵犬小哈吧狗波斯狗第5頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二1.什么是繼承簡單地說,“繼承”是指某類事物具有比其父輩事物更一般性的某些特征(或稱為屬性),用對象和類的術(shù)語,我們可以這樣表達(dá):對象和類“繼承”了另一個(gè)類的一組屬性。第6頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二2.基類與派生類可以將上圖中的各個(gè)方塊看作是一個(gè)類,因此,例子中所涉及的這些類之間構(gòu)成了一幅清晰的層次結(jié)構(gòu),既有類稱為基類,以它為基礎(chǔ)建立的新類稱為派生類。 第7頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二7.2使用繼承 繼承的一般形式如下:class 派生類:訪
3、問權(quán)限 基類 訪問權(quán)限是訪問控制說明符,它可以是public、private或protected。 第8頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二繼承與派生的目的繼承的目的:實(shí)現(xiàn)代碼重用。派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決(或不能完全解決)時(shí),需要對原有程序進(jìn)行改造。第9頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二派生類的聲明class 派生類名:繼承方式 基類名 成員聲明;第10頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二繼承方式不同繼承方式的影響主要體現(xiàn)在:派生類成員對基類成員的訪問權(quán)限通過派生類對象對基類成員的訪問權(quán)限三種繼承方式公有
4、繼承私有繼承保護(hù)繼承第11頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二范例繼承應(yīng)用的例子1 創(chuàng)建派生類對象并進(jìn)行初始化,在主程序中通過繼承基類的成員屬性,即可將三維對象的坐標(biāo)值進(jìn)行輸出。繼承應(yīng)用的例子2 在主程序中創(chuàng)建派生類對象b,對象b調(diào)用基類的公有成員函數(shù)傳遞參數(shù),然后對象b再調(diào)用自己的成員函數(shù)進(jìn)行輸出。 第12頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二范例繼承應(yīng)用的例子1 創(chuàng)建派生類對象并進(jìn)行初始化,在主程序中通過繼承基類的成員屬性,即可將三維對象的坐標(biāo)值進(jìn)行輸出。繼承應(yīng)用的例子2 在主程序中創(chuàng)建派生類對象b,對象b調(diào)用基類的公有成員函數(shù)傳遞參數(shù),然后對象b
5、再調(diào)用自己的成員函數(shù)進(jìn)行輸出。 第13頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二公有繼承(public)基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對象只能訪問基類的public成員。類成員的訪問控制第14頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-1 公有繼承舉例class Point/基類Point類的聲明public:/公有函數(shù)成員void InitP(flo
6、at xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff, float yOff) X+=xOff;Y+=yOff;float GetX() return X;float GetY() return Y;private:/私有數(shù)據(jù)成員float X,Y;類成員的訪問控制第15頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class Rectangle: public Point /派生類聲明public:/新增公有函數(shù)成員void InitR(float x, float y, float w, float h)InitP(x,y);W
7、=w;H=h;/調(diào)用基類公有成員函數(shù)float GetH() return H;float GetW() return W;private:/新增私有數(shù)據(jù)成員float W,H;16第16頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二#include#includeusing namecpace std;int main() Rectangle rect;rect.InitR(2,3,20,10); /通過派生類對象訪問基類公有成員rect.Move(3,2); coutrect.GetX(), rect.GetY(),rect.GetH(),rect.GetW()endl;ret
8、urn 0;17第17頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二私有繼承(private)基類的public和protected成員都以private身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對象不能直接訪問基類中的任何成員。類成員的訪問控制第18頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-2 私有繼承舉例class Rectangle: private Point/派生類聲明public:/新增外部接口void
9、InitR(float x, float y, float w, float h)InitP(x,y);W=w;H=h;/訪問基類公有成員void Move(float xOff, float yOff) Point:Move(xOff,yOff);float GetX() return Point:GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:/新增私有數(shù)據(jù)float W,H;類成員的訪問控制第19頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二
10、#include#includeusing namecpace std;int main() /通過派生類對象只能訪問本類成員 Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,2);coutrect.GetX(), rect.GetY(),rect.GetH(),rect.GetW()endl;return 0;20第20頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二保護(hù)繼承(protected)基類的public和protected成員都以protected身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。派生類中的成員
11、函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對象不能直接訪問基類中的任何成員類成員的訪問控制第21頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二protected 成員的特點(diǎn)與作用對建立其所在類對象的模塊來說,它與 private 成員的性質(zhì)相同。對于其派生類來說,它與 public 成員的性質(zhì)相同。既實(shí)現(xiàn)了數(shù)據(jù)隱藏,又方便繼承,實(shí)現(xiàn)代碼重用。類成員的訪問控制第22頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-3 protected 成員舉例class A protected: int x;in
12、t main() A a; a.x=5; /錯(cuò)誤類成員的訪問控制第23頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class A protected: int x;class B: public A public: void Function();void B:Function() x=5; /正確24第24頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二類型兼容規(guī)則一個(gè)公有派生類的對象在使用上可以被當(dāng)作基類的對象,反之則禁止。具體表現(xiàn)在:派生類的對象可以被賦值給基類對象。派生類的對象可以初始化基類的引用。指向基類的指針也可以指向派生類。通過基類對象名、指針只能使用從基
13、類繼承的成員類型兼容第25頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-4 類型兼容規(guī)則舉例#include using namecpace std;class B0/基類B0聲明 public:void display()coutB0:display()endl;/公有成員函數(shù);類型兼容第26頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class B1: public B0 public:void display()coutB1:display()endl;class D1: public B1public:void display()coutD1:displ
14、ay()display();/對象指針-成員名 27第27頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二int main()/主函數(shù)B0 b0;/聲明B0類對象B1 b1;/聲明B1類對象D1 d1;/聲明D1類對象B0 *p;/聲明B0類指針p=&b0;/B0類指針指向B0類對象fun(p);p=&b1;/B0類指針指向B1類對象fun(p);p=&d1;/B0類指針指向D1類對象fun(p);運(yùn)行結(jié)果:B0:display()B0:display()B0:display()28第28頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二基類與派生類的對應(yīng)關(guān)系單繼承派生類只從
15、一個(gè)基類派生。多繼承派生類從多個(gè)基類派生。多重派生由一個(gè)基類派生出多個(gè)不同的派生類。多層派生派生類又作為基類,繼續(xù)派生新的類。單繼承與多繼承第29頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二多繼承時(shí)派生類的聲明class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,. 成員聲明;注意:每一個(gè)“繼承方式”,只用于限制對緊隨其后之基類的繼承。單繼承與多繼承第30頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二多繼承舉例class A public: void setA(int); void showA(); private: int a;class B publi
16、c: void setB(int); void showB();private: int b;class C : public A, private B public: void setC(int, int, int); void showC(); private: int c;單繼承與多繼承第31頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二void A:setA(int x) a=x; void B:setB(int x) b=x; void C:setC(int x, int y, int z) /派生類成員直接訪問基類的 /公有成員 setA(x); setB(y); c=
17、z;/其它函數(shù)實(shí)現(xiàn)略int main() C obj; obj.setA(5); obj.showA(); obj.setC(6,7,9); obj.showC();/ obj.setB(6); 錯(cuò)誤/ obj.showB(); 錯(cuò)誤 return 0;32第32頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二繼承時(shí)的構(gòu)造函數(shù)基類的構(gòu)造函數(shù)不被繼承,派生類中需要聲明自己的構(gòu)造函數(shù)。聲明構(gòu)造函數(shù)時(shí),只需要對本類中新增成員進(jìn)行初始化,對繼承來的基類成員的初始化,自動調(diào)用基類構(gòu)造函數(shù)完成。派生類的構(gòu)造函數(shù)需要給基類的構(gòu)造函數(shù)傳遞參數(shù)派生類的構(gòu)造、析構(gòu)函數(shù)第33頁,共76頁,2022年,5月
18、20日,19點(diǎn)51分,星期二單一繼承時(shí)的構(gòu)造函數(shù)派生類名:派生類名(基類所需的形參,本類成員所需的形參):基類名(參數(shù)表) 本類成員初始化賦值語句;派生類的構(gòu)造、析構(gòu)函數(shù)第34頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二單一繼承時(shí)的構(gòu)造函數(shù)舉例#includeusing namecpace std;class B public: B(); B(int i); B(); void Print() const; private: int b;派生類的構(gòu)造、析構(gòu)函數(shù)第35頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二B:B()b=0;coutBs default const
19、ructor called.endl;B:B(int i)b=i; coutBs constructor called. endl;B:B()coutBs destructor called.endl; void B:Print() constcoutbendl; 36第36頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class C:public B public: C(); C(int i,int j); C(); void Print() const;private: int c;37第37頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二C:C()c=0;coutC
20、s default constructor called.endl;C:C(int i,int j):B(i)c=j;coutCs constructor called.endl;C:C()coutCs destructor called.endl; void C:Print() constB:Print();coutcendl; int main()C obj(5,6);obj.Print(); 38第38頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二多繼承時(shí)的構(gòu)造函數(shù)派生類名:派生類名(基類1形參,基類2形參,.基類n形參,本類形參):基類名1(參數(shù)), 基類名2(參數(shù)), .
21、基類名n(參數(shù)) 本類成員初始化賦值語句;派生類的構(gòu)造、析構(gòu)函數(shù)第39頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二派生類與基類的構(gòu)造函數(shù)當(dāng)基類中聲明有默認(rèn)形式的構(gòu)造函數(shù)或未聲明構(gòu)造函數(shù)時(shí),派生類構(gòu)造函數(shù)可以不向基類構(gòu)造函數(shù)傳遞參數(shù)。若基類中未聲明構(gòu)造函數(shù),派生類中也可以不聲明,全采用缺省形式構(gòu)造函數(shù)。當(dāng)基類聲明有帶形參的構(gòu)造函數(shù)時(shí),派生類也應(yīng)聲明帶形參的構(gòu)造函數(shù),并將參數(shù)傳遞給基類構(gòu)造函數(shù)。派生類的構(gòu)造、析構(gòu)函數(shù)第40頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二多繼承且有內(nèi)嵌對象時(shí)的構(gòu)造函數(shù)派生類名:派生類名(基類1形參,基類2形參,.基類n形參,本類形參):基類名
22、1(參數(shù)), 基類名2(參數(shù)), .基類名n(參數(shù)),對象數(shù)據(jù)成員的初始化 本類成員初始化賦值語句;派生類的構(gòu)造、析構(gòu)函數(shù)第41頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二構(gòu)造函數(shù)的調(diào)用次序1 調(diào)用基類構(gòu)造函數(shù),調(diào)用順序按照它們被繼承時(shí)聲明的順序(從左向右)。2 調(diào)用成員對象的構(gòu)造函數(shù),調(diào)用順序按照它們在類中聲明的順序。3 派生類的構(gòu)造函數(shù)體中的內(nèi)容。派生類的構(gòu)造、析構(gòu)函數(shù)第42頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二拷貝構(gòu)造函數(shù)若建立派生類對象時(shí)調(diào)用缺省拷貝構(gòu)造函數(shù),則編譯器將自動調(diào)用基類的缺省拷貝構(gòu)造函數(shù)。若編寫派生類的拷貝構(gòu)造函數(shù),則需要為基類相應(yīng)的拷貝構(gòu)
23、造函數(shù)傳遞參數(shù)。例如:C:C(C &c1):B(c1)派生類的構(gòu)造、析構(gòu)函數(shù)第43頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-5 派生類構(gòu)造函數(shù)舉例#include using namecpace std;class B1/基類B1,構(gòu)造函數(shù)有參數(shù)public:B1(int i) coutconstructing B1 iendl;class B2/基類B2,構(gòu)造函數(shù)有參數(shù)public:B2(int j) coutconstructing B2 jendl;class B3/基類B3,構(gòu)造函數(shù)無參數(shù)public:B3()coutconstructing B3 *endl;派
24、生類的構(gòu)造、析構(gòu)函數(shù)第44頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class C: public B2, public B1, public B3 public:/派生類的公有成員C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b) private:/派生類的私有對象成員B1 memberB1;B2 memberB2;B3 memberB3;int main()C obj(1,2,3,4); 運(yùn)行結(jié)果:constructing B2 2constructing B1 1constructing B
25、3 *constructing B1 3constructing B2 4constructing B3 *45第45頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二繼承時(shí)的析構(gòu)函數(shù)析構(gòu)函數(shù)也不被繼承,派生類自行聲明聲明方法與一般(無繼承關(guān)系時(shí))類的析構(gòu)函數(shù)相同。不需要顯式地調(diào)用基類的析構(gòu)函數(shù),系統(tǒng)會自動隱式調(diào)用。析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反。派生類的構(gòu)造、析構(gòu)函數(shù)第46頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-6 派生類析構(gòu)函數(shù)舉例派生類的構(gòu)造、析構(gòu)函數(shù)#include using namecpace std;class B1/基類B1聲明 public:
26、B1(int i) coutconstructing B1 iendl;B1() coutdestructing B1 endl;class B2/基類B2聲明public:B2(int j) coutconstructing B2 jendl;B2() coutdestructing B2 endl;class B3/基類B3聲明public:B3()coutconstructing B3 *endl;B3() coutdestructing B3 endl;第47頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class C: public B2, public B1, publ
27、ic B3public:C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b)private:B1 memberB1;B2 memberB2;B3 memberB3;int main()C obj(1,2,3,4); 48第48頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-6 運(yùn)行結(jié)果constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing B2 4constructing B3 *destruc
28、ting B3destructing B2destructing B1destructing B3destructing B1destructing B2第49頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二同名隱藏規(guī)則當(dāng)派生類與基類中有相同成員時(shí):若未強(qiáng)行指名,則通過派生類對象使用的是派生類中的同名成員。如要通過派生類對象訪問基類中被覆蓋的同名成員,應(yīng)使用基類名限定。派生類成員的標(biāo)識與訪問第50頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-7 多繼承同名隱藏舉例派生類成員的標(biāo)識與訪問#include using namecpace std;class B1/聲明基
29、類B1 public:/外部接口int nV;void fun() coutMember of B1endl;class B2/聲明基類B2 public:/外部接口int nV;void fun()coutMember of B2endl;class D1: public B1, public B2 public:int nV;/同名數(shù)據(jù)成員void fun()coutMember of D1endl;/同名函數(shù)成員;第51頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二int main()D1 d1;d1.nV=1; /對象名.成員名標(biāo)識, 訪問D1類成員d1.fun(); d1
30、.B1:nV=2;/作用域分辨符標(biāo)識, 訪問基類B1成員d1.B1:fun();d1.B2:nV=3;/作用域分辨符標(biāo)識, 訪問基類B2成員d1.B2:fun();52第52頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二二義性問題在多繼承時(shí),基類與派生類之間,或基類之間出現(xiàn)同名成員時(shí),將出現(xiàn)訪問時(shí)的二義性(不確定性)采用虛函數(shù)(第8章)或同名隱藏規(guī)則來解決。當(dāng)派生類從多個(gè)基類派生,而這些基類又從同一個(gè)基類派生,則在訪問此共同基類中的成員時(shí),將產(chǎn)生二義性采用虛基類來解決。派生類成員的標(biāo)識與訪問第53頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二二義性問題舉例(一)clas
31、s A public: void f();class B public: void f(); void g();class C: public A, piblic B public: void g(); void h();如果聲明:C c1;則 c1.f(); 具有二義性而 c1.g(); 無二義性(同名覆蓋)派生類成員的標(biāo)識與訪問第54頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二二義性的解決方法解決方法一:用類名來限定c1.A:f() 或 c1.B:f()解決方法二:同名覆蓋在C 中聲明一個(gè)同名成員函數(shù)f(),f()再根據(jù)需要調(diào)用 A:f() 或 B:f()派生類成員的標(biāo)識與訪
32、問第55頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二二義性問題舉例(二)class B public: int b;class B1 : public B private: int b1;class B2 : public B private: int b2;class C : public B1,public B2 public: int f(); private: int d;派生類成員的標(biāo)識與訪問第56頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二派生類C的對象的存儲結(jié)構(gòu)示意圖:bb1bb2dB類成員B類成員B1類成員B2類成員C類對象有二義性:C c;c.bc
33、.B:b無二義性:c.B1:bc.B2:b57第57頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二虛基類虛基類的引入用于有共同基類的場合聲明以virtual修飾說明基類例:class B1:virtual public B作用主要用來解決多繼承時(shí)可能發(fā)生的對同一基類繼承多次而產(chǎn)生的二義性問題.為最遠(yuǎn)的派生類提供唯一的基類成員,而不重復(fù)產(chǎn)生多次拷貝注意:在第一級繼承時(shí)就要將共同基類設(shè)計(jì)為虛基類。第58頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二虛基類舉例class B private: int b;class B1 : virtual public B private:
34、 int b1;class B2 : virtual public B private: int b2;class C : public B1, public B2 private: float d;下面的訪問是正確的:C cobj;cobj.b; 虛 基 類第59頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二虛基類的派生類對象存儲結(jié)構(gòu)示意圖:BB1B2Cb1b2dB1類成員B2類成員C類對象bB類成員60第60頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二例7-8虛基類舉例 虛 基 類D1nV :int nVd:intB1:nV1:intB2:nV2:intfund(
35、):voidfun():voidB1nV1 :intB2nV2 :intD1nVd :intfund():void B0nV :intfun()第61頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二B0B1新增成員B0B2新增成員D1新增成員B0B0B1B2D1nV,fun()62第62頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二#include using namecpace std;class B0/聲明基類B0 public:/外部接口int nV;void fun()coutMember of B0endl;class B1: virtual public B0
36、 /B0為虛基類,派生B1類 public:/新增外部接口int nV1;class B2: virtual public B0 /B0為虛基類,派生B2類 public:/新增外部接口int nV2;63第63頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class D1: public B1, public B2/派生類D1聲明 public:/新增外部接口int nVd;void fund()coutMember of D1endl;int main()/程序主函數(shù) D1 d1;/聲明D1類對象d1d1.nV=2;/使用最遠(yuǎn)基類成員d1.fun();64第64頁,共76頁,2
37、022年,5月20日,19點(diǎn)51分,星期二虛基類及其派生類構(gòu)造函數(shù)建立對象時(shí)所指定的類稱為最(遠(yuǎn))派生類。虛基類的成員是由最派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化的。在整個(gè)繼承結(jié)構(gòu)中,直接或間接繼承虛基類的所有派生類,都必須在構(gòu)造函數(shù)的成員初始化表中給出對虛基類的構(gòu)造函數(shù)的調(diào)用。如果未列出,則表示調(diào)用該虛基類的缺省構(gòu)造函數(shù)。在建立對象時(shí),只有最派生類的構(gòu)造函數(shù)調(diào)用虛基類的構(gòu)造函數(shù),該派生類的其它基類對虛基類構(gòu)造函數(shù)的調(diào)用被忽略。 虛 基 類第65頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二有虛基類時(shí)的構(gòu)造函數(shù)舉例 虛 基 類#include using namecpa
38、ce std;class B0/聲明基類B0 public:/外部接口B0(int n) nV=n;int nV;void fun()coutMember of B0endl;class B1: virtual public B0 public:B1(int a) : B0(a) int nV1;class B2: virtual public B0 public:B2(int a) : B0(a) int nV2;第66頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二class D1: public B1, public B2public:D1(int a) : B0(a), B1
39、(a), B2(a)int nVd;void fund()coutMember of D1endl;int main()D1 d1(1);d1.nV=2;d1.fun();67第67頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二綜合舉例例7-10(課后閱讀)這個(gè)程序有兩點(diǎn)不足:基類的成員函數(shù)pay() 的函數(shù)體為空,在實(shí)現(xiàn)部分仍要寫出函數(shù)體,顯得冗余。在main()函數(shù)中,建立了四個(gè)不同類的對象,對它們進(jìn)行了類似的操作,但是卻重復(fù)寫了四遍類似的語句,程序不夠簡潔。第68頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二7.4綜合應(yīng)用 下面通過范例講解一個(gè)綜合例子,通過這個(gè)例
40、子讀者可以進(jìn)一步體會繼承和多重繼承的特點(diǎn)。第69頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二范例繼承的應(yīng)用 主程序中創(chuàng)建派生類對象cm,然后按照基類1,基類2,派生類的順序依次調(diào)用構(gòu)造函數(shù)進(jìn)行輸出,釋放對象時(shí)按照構(gòu)造函數(shù)相反的順序依次調(diào)用析構(gòu)函數(shù)進(jìn)行輸出。 第70頁,共76頁,2022年,5月20日,19點(diǎn)51分,星期二7.6 跟我上機(jī)設(shè)計(jì)一個(gè)基類base,包含姓名和年齡私有數(shù)據(jù)成員以及相關(guān)的成員函數(shù),由它派生出領(lǐng)導(dǎo)類leader,包含職務(wù)和部門私有數(shù)據(jù)成員以及相關(guān)的成員函數(shù)。再由base派生出教師類techer,包含職稱和專業(yè)私有數(shù)據(jù)成員以及相關(guān)的成員函數(shù)。然后由1eader和techer類派生出教學(xué)主任類chairman。請編寫一個(gè)完整的C+程序,并采
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 知識產(chǎn)權(quán)新員工培訓(xùn)課件
- 春風(fēng)十里才子歸來
- 主播直播培訓(xùn)
- 二零二五年度建筑垃圾清運(yùn)合同示范3篇
- 珠寶瓷器知識培訓(xùn)課件
- “雙減”政策下語文作業(yè)的設(shè)計(jì)趨勢
- 臨床C1q 腎病病因、發(fā)病機(jī)制、關(guān)鍵診斷特征、病理三鏡、鑒別診斷及病理圖譜
- 兒科超聲對小兒急腹癥診斷要點(diǎn)和注意事項(xiàng)
- 四川省瀘州市江陽區(qū)2024-2025學(xué)年九年級上學(xué)期1月期末考試英語試題(含答案)
- 湖南省長沙市2025年新高考適應(yīng)性考試地理試題(含答案)
- 住宅設(shè)計(jì)效果圖協(xié)議書
- 新版中國食物成分表
- 浙江省溫州市溫州中學(xué)2025屆數(shù)學(xué)高二上期末綜合測試試題含解析
- 2024河南鄭州市金水區(qū)事業(yè)單位招聘45人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 食物損失和浪費(fèi)控制程序
- TCI 373-2024 中老年人免散瞳眼底疾病篩查規(guī)范
- 2024四川太陽能輻射量數(shù)據(jù)
- 石油鉆采專用設(shè)備制造考核試卷
- 法人變更股權(quán)轉(zhuǎn)讓協(xié)議書(2024版)
- 研究生中期考核匯報(bào)模板幻燈片
- 培訓(xùn)機(jī)構(gòu)與學(xué)校合作協(xié)議書范本
評論
0/150
提交評論