資源描述:
《c++學(xué)習(xí)筆記(15)——靜態(tài)綁定與動(dòng)態(tài)綁定》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、C++學(xué)習(xí)筆記(15)——靜態(tài)綁定與動(dòng)態(tài)綁定???????????????????????靜態(tài)綁定:編譯時(shí)綁定,通過(guò)對(duì)象調(diào)用動(dòng)態(tài)綁定:運(yùn)行時(shí)綁定,通過(guò)地址實(shí)現(xiàn)????????????????????????C++的多態(tài)性????????????????????????靜態(tài)多態(tài)性:函數(shù)多態(tài)性——函數(shù)重載?????????????????????????模板多態(tài)性——C++模板(類模板、函數(shù)模板)?動(dòng)態(tài)多態(tài)性:虛函數(shù)(只有用地址才能實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性)????????????????????????只有采用“指針->函數(shù)()”或“引用變量.函數(shù)()”的方式調(diào)用C++類中的虛函數(shù)
2、才會(huì)執(zhí)行動(dòng)態(tài)綁定。對(duì)于C++中的非虛函數(shù),因?yàn)槠洳痪邆鋭?dòng)態(tài)綁定的特征,所以不管采用什么樣的方式調(diào)用,都不會(huì)執(zhí)行動(dòng)態(tài)綁定。??????????????????C++語(yǔ)言成員函數(shù)的調(diào)用和綁定方式總結(jié)代碼形式對(duì)于虛函數(shù)對(duì)于非虛函數(shù)作用綁定方式作用綁定方式類名::函數(shù)()調(diào)用指定類的指定函數(shù)靜態(tài)綁定調(diào)用指定類的指定函數(shù)靜態(tài)綁定對(duì)象名.函數(shù)()調(diào)用指定對(duì)象的指定函數(shù)靜態(tài)綁定調(diào)用指定對(duì)象的指定函數(shù)靜態(tài)綁定引用變量.函數(shù)()調(diào)用被引用對(duì)象所屬類的指定函數(shù)動(dòng)態(tài)綁定調(diào)用引用變量所屬類的指定函數(shù)靜態(tài)綁定指針->函數(shù)()調(diào)用被引用對(duì)象所屬類的指定函數(shù)動(dòng)態(tài)綁定調(diào)用指針變量所屬類的指定函數(shù)靜態(tài)綁
3、定????????????????????????????注:被引用對(duì)象所屬類是指針或引用指向的對(duì)象的實(shí)際類型;引用變量所屬類、指針變量所屬類是定義引用變量、指針變量的類型;以上兩種類型可能相同,也可能不同。????????????????????????從上表可以看出,執(zhí)行動(dòng)態(tài)綁定的只有通過(guò)地址,即只有通過(guò)指針或引用變量才能實(shí)現(xiàn),而且還必須是虛函數(shù)。從概念上來(lái)說(shuō),虛函數(shù)機(jī)制只有在應(yīng)用于地址時(shí)才有效,因?yàn)榈刂吩诰幾g階段提供的類型信息不完全。??????????????????????????????例:編寫(xiě)程序觀察虛函數(shù)和非虛函數(shù)的綁定行為:??????????????
4、????????????代碼如下:?????????????/**//*************************************************************************?動(dòng)態(tài)綁定與靜態(tài)綁定************************************************************************/#include?class?CBase...{public:????virtual?int?func()?const????//虛函數(shù)????...{????????c
5、out<<"CBase?function!";????????return?100;????}};class?CDerive?:?public?CBase...{public:????int?func()?const????????//在派生類中重新定義虛函數(shù)????...{????????cout<<"CDerive?function!";????????return?200;????}};void?main()...{????CDerive?obj1;????CBase*?p1=&obj1;????CBase&?p2=obj1;????CBase?obj2;????
6、obj1.func();????//靜態(tài)綁定:調(diào)用對(duì)象本身(派生類CDerive對(duì)象)的?func?函數(shù)????p1->func();????//動(dòng)態(tài)綁定:調(diào)用被引用對(duì)象所屬類(派生類CDerive)的?func?函數(shù)????p2.func();????//動(dòng)態(tài)綁定:調(diào)用被引用對(duì)象所屬類(派生類CDerive)的?func?函數(shù)????obj2.func();????//靜態(tài)綁定:調(diào)用對(duì)象本身(基類CBase對(duì)象)的函數(shù)}???????????????????????????運(yùn)行結(jié)果: