本篇介紹c++中的物件模型中虛指標vptr,虛表vtbl,動態繫結dynamic binding的相關知識點。
如果c++類成員中有虛函式,那麼對應的物件中就有除了本身資料外的虛指標vptr(4個位元組),虛指標指向虛表vtbl,虛表中存放虛函式的位址。如下圖所示:
注意點:
如圖當指標p指向物件c,用p呼叫c中的虛函式vfunc1(),即p->func1()時的過程是:
a、首先,p會先指向虛指標 p->vptr;
b、接著,通過虛指標物件虛表找到呼叫函式的位址(*(p->vptr)[n]);
c、最後,通過物件呼叫實現(*(p->vptr)[n])(p)。
如下圖,cdocument類和cmydoc類為繼承關係,serialize()為成員函式cdocument::onfileopen()中的乙個虛函式:
當使用主程式:
cmydoc mydoc;
mydoc.onfileopen(); //相當於cdocument::onfileopen(this);或相當於cdocument::onfileopen(&mydoc)
注意點:
a、如注釋所示,當子類呼叫父類方法時,在呼叫方法中有個隱藏的this,代表子類物件;
b、當執行onfileopen()函式時,執行到serialize()函式,其實是執行this->serialize(),而this代表子類,所以會呼叫子類的虛函式serialize()。
4、關於物件模型中的動態繫結
1)示例
class animal
virtual void eat() const
private:
int age;
};class horse:public animal
virtual void eat() const
private:
int num;
};
說明:標頭檔案中設計用於測試,兩個類是繼承關係,有乙個虛函式eat().
2)主程式
int _tmain(int argc, _tchar* argv)
注意點:
a、#2輸出的是父類的虛函式,因為這是靜態繫結,通過父類物件呼叫虛函式;
b、#3輸出的子類的虛函式,因為這是動態繫結,滿足動態繫結的條件①通過up-cast方式;②通過指標呼叫;③呼叫的是虛函式。
10 C 中的新成員
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 動態記憶體分配 1 c 中的動態記憶體分配 c 中通過new關鍵字進行動態記憶體申請 c 中的動態記憶體申請是基於型別進行的 delete關鍵字用於記憶體釋放 釋放陣列記憶...
cpp教程10 C 中的lambda
看完c 中的lamda,感覺總體來說,不愧是 c 乙個lamda 都搞的可以玩出花來!下面我簡單介紹一下lamda表示式在 c 中的語法。作為乙個從 python 來的 c 人,我被c 的lamda 震驚了。以開頭,lambda 語法可以生成乙個臨時的或者說匿名的函式物件,因此可以方便的支援函式式程...
object 物件中的clone
1.object中的clone執行的時候使用了rtti run time type identification 的機制,動態得找到目前正在呼叫clone方法的那個reference,根據它的大小申請記憶體空間,然後進行bitwise的複製,將該物件的記憶體空間完全複製到新的空間中去,從而達到sha...