C 關於繼承裡虛函式的一些動態繫結與靜態繫結

2022-05-20 02:22:34 字數 2676 閱讀 4492

a類

class

a

virtual

void

vfunc1()

};

b類

class b :public

a};

void

testbinding()

再來看看反彙編後的形式

b b;

00ef9a6a

leaecx,[b]

00ef9a6d

call

b::b (0ef1366h)

00ef9a72

mov dword ptr [ebp-4],0

a a = (a)b

;00ef9a79

leaeax,[b]

00ef9a7c

push

eax

00ef9a7d

leaecx,[a]

00ef9a80

call

a::a (0ef134dh)

00ef9a85

mov byte ptr [ebp-4],1

a.vfunc1()

;00ef9a89

leaecx,[a]

00ef9a8c

call

a::vfunc1 (0ef1168h)

a* pa = new b

;00ef9a91

push

20h

00ef9a93

call

operator new (0ef11a4h)

00ef9a98

add esp,4

00ef9a9b

movdword ptr [ebp-140h],eax

00ef9aa1

mov byte ptr [ebp-4],2

00ef9aa5

cmp dword ptr [ebp-140h],0

00ef9aac

jetestbinding+0a1h (0ef9ac1h)

00ef9aae

movecx,dword ptr [ebp-140h]

00ef9ab4

call

b::b (0ef1366h)

00ef9ab9

movdword ptr [ebp-148h],eax

00ef9abf

jmptestbinding+0abh (0ef9acbh)

00ef9ac1

mov dword ptr [ebp-148h],0

00ef9acb

moveax,dword ptr [ebp-148h]

00ef9ad1

movdword ptr [ebp-134h],eax

00ef9ad7

mov byte ptr [ebp-4],1

00ef9adb

movecx,dword ptr [ebp-134h]

00ef9ae1

movdword ptr [pa],ecx

pa->vfunc1()

;00ef9ae4

moveax,dword ptr [pa]

00ef9ae7

movedx,dword ptr [eax]

00ef9ae9

movesi,esp

00ef9aeb

movecx,dword ptr [pa]

00ef9aee

moveax,dword ptr [edx]

00ef9af0

call

eax

00ef9af2

cmpesi,esp

00ef9af4

call

__rtc_checkesp (0ef1406h)

pa = &b

;00ef9af9

leaeax,[b]

00ef9afc

movdword ptr [pa],eax

pa->vfunc1()

;00ef9aff

moveax,dword ptr [pa]

00ef9b02

movedx,dword ptr [eax]

00ef9b04

movesi,esp

00ef9b06

movecx,dword ptr [pa]

00ef9b09

moveax,dword ptr [edx]

00ef9b0b

call

eax

00ef9b0d

cmpesi,esp

00ef9b0f

call

__rtc_checkesp (0ef1406h)

}

我們可以看到彙編中的靜態繫結是直接呼叫了a的::vfunc1

而動態繫結則是將物件自身傳給了pa,並向上轉型,呼叫的就是自身的vfunc1

關於c 的虛函式的一些總結

對於什麼時候子類會覆蓋父類中的函式 1 如果子類的東西和父類是一樣的,那麼肯定是子類覆蓋父類中的函式 2 如果子類的函式和父類的函式一模一樣,就是前面少了個virtual那麼,子類還是覆蓋父類的函式 3 如果子類和父類的函式返回值不一樣,那麼子類是不覆蓋父類的函式 4 最糾結的應該算是對於引數含有預...

C 裡面關於虛函式的一些注意點

最後,總結一下關於虛函式的一些常見問題 1 虛函式是動態繫結的,也就是說,使用虛函式的指標和引用能夠正確找到實際類的對應函式,而不是執行定義類的函式。這是虛函式的基本功能,就不再解釋了。2 建構函式不能是虛函式。而且,在建構函式中呼叫虛函式,實際執行的是父類的對應函式,因為自己還沒有構造好,多型是被...

關於c 繼承的一些問題

繼承是物件導向軟體技術當中的乙個概念,與多型 封裝共為物件導向的三個基本特徵。繼承可以使得子類具有父類的屬性和方法或者重新定義 追加屬性和方法等。被繼承的類稱為基類或者是父類 繼承的類被稱為子類或者是派生類。繼承方式分為三類 公有繼承 保護繼承 私有繼承。三類繼承的不同之處,是改變繼承成員資料的訪問...