C 侯捷 虛指標和虛表動態繫結

2021-10-05 02:40:24 字數 1369 閱讀 6202

繼承和組合中構造和析構,可以通過記憶體的角度進行分析。

繼承關係是構造父類被包含在子類中,所以構造必須由內而外,析構方向相反。

組合關係是擁有的關係,建構函式也是由內而外,析構方向相反。

繼承和組合的構造/析構函式後面編譯器會加上父類的建構函式:

container::container():component()

繼承和組合同時存在的情況下,父類和組合都存在與子類中,兩個的前後關係沒有規定,構造也由內而外,析構相反。先父類後組合,析構是先組合再父類。

只有類中有虛函式,其記憶體物件中就會多乙個指標,不管虛函式有多少個,都只有乙個。子類的記憶體物件中有父類的part。有虛函式也是同樣的關係。

從類的角度,繼承會把父類的記憶體和成員繼承下來,函式繼承是繼承它的呼叫權。

函式是一塊**,再記憶體中是一塊,在類中虛函式會生成乙個指標表,每個指標指向對應的函式段。如果子類中重寫了父類的虛函式,雖然子類的虛函式表中對應函式指標會指向重寫的函式位址,但是,不代表父類的舊的函式段會被覆蓋,它還是在的。前面的類名不同了。

class

aclass

bclass

c```cpp

```cpp

a::vfunc1()

//1a::

vfunc2()

//2b::

vfunc1()

//3c::

vfunc2()

//4

a物件的虛函式表中有兩個指標,分別指向1和2

b物件的虛函式表中有兩個指標,分別指向2和3

c物件的虛函式表中有兩個指標,分別指向3和4

在c語言中編譯器通過靜態繫結的方法進行,將當前的位址儲存起來,呼叫call指令跳轉到呼叫的函式中,處理完成後再返回來。而虛函式是通過動態繫結的方法,通過物件中定的虛函式表指標找到虛函式表,再從虛函式表中找到對應的虛函式指標,然後呼叫起這個函式。

動態繫結(虛機制)的實現和條件:

1、必須是指標

2、指標是向上指定的,型別是父類,可以new成子類物件

3、必須是虛函式

靜態繫結一定指向某個固定的位址,動態要根據具體來判斷。這種動態繫結的方法就叫做多型。刪改你的概念其實都是同乙個概念,走的是虛指標和虛表。

tempate method

父類把所有能實現的方法都實現了,生乙個serialize不知道怎麼實現,留給子類來進行實現。呼叫的時候動態繫結,onfileopen方法中編譯器會傳乙個this指標,這個指標指向的是子類的物件,這個子類可以向上轉型。同事

cdocument:

onfileopen()

virtual serialize();

class cmydoc: pulbic cdocument

}main()

C 虛指標 虛表

可分為靜態多型和動態多型 過載比較簡單這裡就不說,今天我們主要來談一談虛函式 如何驗證vptr指標存在?先看如下 父親類中沒有宣告虛函式,只有乙個int成員,而子類中宣告虛函式,並且擁有乙個int成員 include using namespace std class father class ch...

虛指標和虛表

所以當用sizeof來獲取含有虛函式的類的大小的時候,會發現結果 比 裡面還有的資料 大4個位元組。這四個位元組就是 虛 指標。32位系統 子類裡面有父類的成員變數。當然,父類有虛函式,自然 子類 就有虛函式。虛表裡放的都是虛函式的指標,指向虛函式的位址。子類即使沒有重寫 父類的 虛函式,子類的虛表...

關於C 虛表和虛指標

以下為個人的一些理解,如有不對,敬請大家斧正。class base virtual void fun class derive base virtual void act 虛表是c 用於實現多型的一種方式,每個擁有虛函式的類編譯器都會為之分配一張虛表,指向虛表的指標即為虛指標,例如以上兩個類base...