10 C 中的物件模型object model

2021-08-10 18:12:07 字數 1373 閱讀 7318

本篇介紹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...