日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第二章继承与派生

發(fā)布時(shí)間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第二章继承与派生 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這節(jié)課,我們來(lái)學(xué)習(xí)繼承。

當(dāng)從基類派生出新類時(shí),可以對(duì)派生類作如下幾個(gè)變化:

1、可以增加新的成員函數(shù)。

2、可以增加新的成員變量。

3、可以重新定義已有的成員函數(shù)。

4、可以改變現(xiàn)有的成員屬性。


我們先來(lái)學(xué)習(xí)一個(gè)簡(jiǎn)單的派生例子



//這是一個(gè)簡(jiǎn)單的派生例子

首先,創(chuàng)建一個(gè)Location類

Location.h文件如下:

#include <iostream> using namespace std; class Location { private:int iPointX;public:void setPointX(int _iPointX){iPointX = _iPointX;}void showX(){cout<<"X="<<iPointX<<endl;}};


再創(chuàng)建一個(gè)Rectangle類

Rectangle.h文件如下:

#include <iostream> #include "Location.h" //此處可以不寫因?yàn)榭梢岳^承 //using namespace std; class Rectangle:public Location { private:int iHight;public:void setHight(int _iHight){iHight = _iHight;}void showH(){cout<<"H = "<<iHight<<endl;}};

main函數(shù)如下:


#include "Rectangle.h" int main(int argc, const char * argv[]) {Rectangle rect;rect.setPointX(10);rect.setHight(20);rect.showX();rect.showH();return 0; }

代碼下載:http://pan.baidu.com/share/link?shareid=2883935448&uk=3189484501


訪問(wèn)規(guī)則

私有派生例子:

#include <iostream>

usingnamespacestd;


//程序分析:

//在這個(gè)例子中,基類的公有成員iVarA通過(guò)私有派生成了派生類的私有成員,所以當(dāng)Derived類再派生其子類時(shí),iVarA是不可訪問(wèn)的。

//由于私有派生這個(gè)特點(diǎn),因此在實(shí)際工作中私有派生很少使用。


class Base { public: int iVarA;Base(){ iVarA = 10;} }; class Derived:private Base { public: int iVarC;Derived(){ iVarC = 30;} void show(){ cout<<iVarA<<" "<<iVarC<<endl;} }; int main(int argc, constchar * argv[]) { Derived derObj;derObj.show(); return0; }

代碼下載: http://pan.baidu.com/share/link?shareid=3533495783&uk=3189484501


保護(hù)派生

#include <iostream> using namespace std; //程序分析: //在保護(hù)派生中,基類的私有和不可訪問(wèn)成員在派生類中是不可訪問(wèn)的成員在派生類中是不可訪問(wèn)的,基類的保護(hù)成員繼續(xù)是保護(hù)的,而基類的公有成員在派生類中則變?yōu)楸Wo(hù)的。 class Base {public:int iVarA;Base(){iVarA = 10;} }; class Derived:protected Base {public:int iVarC;Derived(){iVarC = 30;}void show(){cout<<iVarA<<" "<<iVarC<<endl;} }; class Temp {public:void tempShow(){Derived tempD;//下面這行代碼報(bào)錯(cuò) 雖然它在Derived的父類即Base類是公有的,但Derived類通過(guò)protected繼承 因此其繼承來(lái)的也會(huì)變?yōu)閜rotected 所以其他類不能直接訪問(wèn)// tempD.iVarA = 10;} }; int main(int argc, const char * argv[]) {Derived derObj;derObj.show();return 0; }


下載地址:http://pan.baidu.com/share/link?shareid=792966415&uk=3189484501

多重繼承例子


#include <iostream> //類C是從類A和類B中共同派生出來(lái)的。類C從類A公有派生,因此,類A的中公有函數(shù)setA和showA在類C中都是公有。 //類C從類B中私有派生,所以類B中的公有函數(shù),在類C中就是私有的。 using namespace std; class A { private:int iVarA;public:void setA(int _iVarA){iVarA = _iVarA;}void showA(){cout<<"iVarA:"<<iVarA<<endl;}}; class B {public:int iVarB;void setB(int _iVarB){iVarB = _iVarB;}void show(){cout<<iVarB<<endl;}}; class C:public A ,private B { private:int iVarC;public:void setC(int _iVarA,int _iVarB,int _iVarC){setA(_iVarA);setB(_iVarB);iVarC = _iVarC;}void showC(){cout<<"iVarC:"<<iVarC<<endl;}}; int main(int argc, const char * argv[]) {C cObj;cObj.setC(1, 2, 3);cObj.showA();cObj.showC();return 0; }






多重繼承中構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序





#include <iostream> using namespace std; class A { protected:int iVarA;public:A(int _iVarA){iVarA = _iVarA;cout<<"Construction A,iVarA = "<<iVarA<<endl;}~A(){cout<<"Destorying A,iVarA="<<iVarA<<endl;}}; class B:public A { private:A objA;int iVarB;public://在派生類中對(duì)繼承的基類成員的初始化,需要由派生類的構(gòu)造函數(shù)調(diào)用基類的構(gòu)造函數(shù)來(lái)完成,這里可以用成員初始化列表來(lái)完成,這和初始化對(duì)象成員有類似之處。//B(派生類的參數(shù)列表):A(基類參數(shù)列表1),objA(基類參數(shù)列表2)//冒號(hào)后面的構(gòu)造函數(shù)成員初始化列表,每一個(gè)基類的構(gòu)造函數(shù)用逗號(hào)隔開,每項(xiàng)由基類名以及括號(hào)內(nèi)的參數(shù)列表組成,參數(shù)列表給出所調(diào)用的構(gòu)造函數(shù)以及所需的參數(shù),如果某個(gè)類使用的是無(wú)參數(shù)或者是缺省的構(gòu)造函數(shù),則該項(xiàng)可以不在成員初始化列表中出現(xiàn)。//當(dāng)說(shuō)明一個(gè)A類的對(duì)象時(shí),首先調(diào)用基類的構(gòu)造函數(shù),對(duì)基類成員進(jìn)行初始化,然后才執(zhí)行派生類A自身的構(gòu)造函數(shù),如果某個(gè)基類仍然是一個(gè)派生類,則這個(gè)過(guò)程遞歸進(jìn)行。當(dāng)該對(duì)象注銷時(shí),析構(gòu)函數(shù)的執(zhí)行順序和執(zhí)行構(gòu)造函數(shù)的順序正好相反。//如果派生類中還有對(duì)象成員,則對(duì)對(duì)象成員的構(gòu)造函數(shù)的調(diào)用,仍然要在初始化列表中完成。B(int _iVarB,int _iVarA,int _objA):A(_iVarA),objA(_objA){iVarB = _iVarB;cout<<"Construction B,iVarB = "<<iVarB<<endl;}~B(){cout<<"Destorying B, iVarB = "<<iVarB<<endl;}}; int main(int argc, const char * argv[]) {// insert code here...//如果有繼承,基類的構(gòu)造函數(shù)最先調(diào)用。B(1,4,5);return 0; }



代碼下載地址:http://pan.baidu.com/share/link?shareid=1053220775&uk=3189484501


多重繼承和雙層繼承


#include <iostream> using namespace std; class Base {public:Base(){cout<<"Construction Base"<<endl;}~Base(){cout<<"Destorying Base"<<endl;} }; class A {public:A(){cout<<"Construction A"<<endl;}~A(){cout<<"Destorying A"<<endl;} }; class B:public Base {public:B(){cout<<"Construction B"<<endl;}~B(){cout<<"Destorying B"<<endl;} }; class C {public:C(){cout<<"Construction C"<<endl;}~C(){cout<<"Destorying C"<<endl;} }; class Object:public A ,public B , public C {public:Object(){cout<<"Construction Object"<<endl;}~Object(){cout<<"Destorying Object"<<endl;} }; //在多重繼承中先執(zhí)行最先繼承的對(duì)象 例如:本例中的A //在雙繼承中例如本例中的B類 B類是繼承自 Base 所以會(huì)先執(zhí)行Base //在析構(gòu)函數(shù)的執(zhí)行順序與構(gòu)造函數(shù)的執(zhí)行順序相反 int main(int argc, const char * argv[]) {// insert code here...Object obj;return 0; }


代碼下載: http://pan.baidu.com/share/link?shareid=1098289671&uk=3189484501


多重繼承中的二義性

#include <iostream> using namespace std; class A {public:void Show(){cout<<"A"<<endl;} }; class B {public:void Show(){cout<<"B"<<endl;}void Print(){cout<<"Print()B"<<endl;} }; //多重繼承是指同時(shí)繼承多個(gè),例如如下: class Object:public A,public B {public:void Print(){cout<<"ObjectA||B"<<endl;}void ObjectShowA(){A::Show();}void ObjectShowB(){B::Show();} }; //如果一個(gè)類是由兩個(gè)以上的類派生出來(lái)的,那么對(duì)基類成員的訪問(wèn)必須是無(wú)二以性的。但是如果基類中含有相同名稱的成員,則訪問(wèn)時(shí)可能產(chǎn)生二義性。 int main(int argc, const char * argv[]) {Object obj;//下面注釋的這種寫法會(huì)報(bào)錯(cuò)因?yàn)闀?huì)存在二義性// obj.Show();obj.A::Show();obj.Print();obj.B::Show();return 0; }


代碼下載: ? http://pan.baidu.com/share/link?shareid=1143818360&uk=3189484501


多層繼承的二義性


#include <iostream> using namespace std; //多層繼承: 如果一個(gè)派生類從多個(gè)基類中派生,并且這些基類又有一個(gè)共同的基類,則在這個(gè)派生類中訪問(wèn)這個(gè)共同的基類中的成員時(shí)可能出現(xiàn)二義性。 class Base {public:int iBaseData;}; class A:public Base {public:int iAData; }; class B:public Base {public:int iBData; }; class Object:public A,public B {public:int iObjectData; }; int main(int argc, const char * argv[]) {Object obj;obj.A::iBaseData = 10;obj.B::iBaseData = 20;cout<<"obj.A::iBaseData = "<<obj.A::iBaseData<<endl;cout<<"obj.B::iBData = "<<obj.B::iBaseData<<endl;return 0; }


代碼下載: ? ?http://pan.baidu.com/share/link?shareid=1208687701&uk=3189484501


虛基類


#include <iostream> using namespace std; //很顯然當(dāng)出現(xiàn)上節(jié)中的兩層繼承時(shí),程序可能會(huì)出現(xiàn)二義性,如果能使這個(gè)公共基類只產(chǎn)生一個(gè)成員實(shí)例的話,很顯然就可以解決這個(gè)二義性的問(wèn)題了,這時(shí)我們可以將這個(gè)基類說(shuō)明虛基類的方式來(lái)解決這個(gè)問(wèn)題,這就要求在Base類派生新類時(shí),使用關(guān)鍵字virtual將Base類說(shuō)明為虛基類 class Base {public:int iBaseData;void Print(){cout<<"iBaseData = " << iBaseData<<endl;} }; class A:virtual public Base {public:int iAData;void Print(){cout<<"In A iBaseData"<<iBaseData<<endl;} }; class B:virtual public Base {public:int iBate;void Print(){cout<<"In B iBaseData = "<<iBaseData<<endl;}}; class Object:public A , public B {public:int iObjectData;void Print(){cout<<"In Object iBaseData = "<<iBaseData<<endl;} }; //虛擬類可以使多層繼承中公共基類只產(chǎn)生一個(gè)實(shí)例,即在類Object中,Base類只有一個(gè)實(shí)例。 //這時(shí)obj.A::iBaseData == obj.B::iBaseData == obj.Object::iBaseData int main(int argc, const char * argv[]) {Object obj;obj.iBaseData = 1000;obj.A::Print();obj.B::Print();obj.Base::Print();obj.Print();//繼承的幾點(diǎn)總結(jié): //能用組合則不用繼承 //繼承的層數(shù)小于等于4層。 //盡量避免使用多重繼承return 0; }



代碼下載: ?http://pan.baidu.com/share/link?shareid=1294366574&uk=3189484501



轉(zhuǎn)載于:https://blog.51cto.com/7097095/1224314

總結(jié)

以上是生活随笔為你收集整理的第二章继承与派生的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。