(1)虛指針與虛表

通過對上圖左側(cè)三個(gè)內(nèi)存數(shù)據(jù)塊的分析可以看出:子類對象繼承了父類的成員數(shù)據(jù)。并且父類有虛函數(shù),子類一定有虛函數(shù)。不僅數(shù)據(jù)會被繼承,函數(shù)也會被繼承。但是應(yīng)當(dāng)注意的是此時(shí)子類繼承的是函數(shù)的調(diào)用權(quán),而不是調(diào)用函數(shù)的空間。
當(dāng)類中存在虛函數(shù),此時(shí)就存在動態(tài)綁定機(jī)制。在動態(tài)綁定中,借助于虛指針vptr與虛表vtbl完成函數(shù)的查找。首先找到vptr,然后找到vtbl,進(jìn)而找到相對應(yīng)的函數(shù)。動態(tài)綁定也被稱之為虛機(jī)制。
動態(tài)綁定(虛機(jī)制)的三個(gè)條件:
<1>通過指針調(diào)用;
<2>指針是向上轉(zhuǎn)型;
<3>調(diào)用的是虛函數(shù)。
(2)this指針

利用對象調(diào)用,對象的地址就是this pointer。所有的成員函數(shù)都有一個(gè)隱藏的this pointer。在上圖中重點(diǎn)應(yīng)當(dāng)理解灰色調(diào)用線路。
(3)動態(tài)綁定與靜態(tài)綁定
B ? ?b;
A ? a = ?(A)b; ? ? ?// B類繼承與A類
a.vfun1();
在上述代碼中,a.vfun1();并解析為匯編語言為call XXXX的形式屬于靜態(tài)綁定。
A* ? ?pa = new B;
pa->vfunc1();
pa = &b;
pa->vfunc1();
上述代碼中函數(shù)調(diào)用屬于動態(tài)綁定。動態(tài)綁定(虛機(jī)制)的三個(gè)條件:<1>通過指針調(diào)用;<2>指針是向上轉(zhuǎn)型;<3>調(diào)用的是虛函數(shù)。
(4)const

對const,應(yīng)當(dāng)注意:當(dāng)成員函數(shù)的const和non-const版本同時(shí)存在時(shí),const object只會(只能)調(diào)用const版本,而non-const object只會(只能)調(diào)用non-const版本。
(5)new與delete
對于new與delete,此處給出了本周的編程作業(yè):



