a類
classb類a
virtual
void
vfunc1()
};
class b :publica};
void再來看看反彙編後的形式testbinding()
b b;我們可以看到彙編中的靜態繫結是直接呼叫了a的::vfunc100ef9a6a
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)
}
而動態繫結則是將物件自身傳給了pa,並向上轉型,呼叫的就是自身的vfunc1
關於c 的虛函式的一些總結
對於什麼時候子類會覆蓋父類中的函式 1 如果子類的東西和父類是一樣的,那麼肯定是子類覆蓋父類中的函式 2 如果子類的函式和父類的函式一模一樣,就是前面少了個virtual那麼,子類還是覆蓋父類的函式 3 如果子類和父類的函式返回值不一樣,那麼子類是不覆蓋父類的函式 4 最糾結的應該算是對於引數含有預...
C 裡面關於虛函式的一些注意點
最後,總結一下關於虛函式的一些常見問題 1 虛函式是動態繫結的,也就是說,使用虛函式的指標和引用能夠正確找到實際類的對應函式,而不是執行定義類的函式。這是虛函式的基本功能,就不再解釋了。2 建構函式不能是虛函式。而且,在建構函式中呼叫虛函式,實際執行的是父類的對應函式,因為自己還沒有構造好,多型是被...
關於c 繼承的一些問題
繼承是物件導向軟體技術當中的乙個概念,與多型 封裝共為物件導向的三個基本特徵。繼承可以使得子類具有父類的屬性和方法或者重新定義 追加屬性和方法等。被繼承的類稱為基類或者是父類 繼承的類被稱為子類或者是派生類。繼承方式分為三類 公有繼承 保護繼承 私有繼承。三類繼承的不同之處,是改變繼承成員資料的訪問...