動態繫結的心得 (轉)
我前不久看了遍《thinking in C++》對動態繫結有了點心得,說出來與大家分享。
如果一個基類(沒有父類)含有虛,那麼在編譯時,會生成一張虛擬函式表,表裡是該類中所有虛擬函式的地址(按出現順序排列);並且會在該類中動態的插入一個成員變數(__vfptr),它是一個指向這個虛擬函式表的指標。對於這個基類的所有子類,編譯器都會生成各自的虛擬函式表,並且把繼承得來的__vfptr指標指向它。例如 :namespace prefix = o ns = "urn:schemas--com::office" />
class BB{
public:
BB();
virtual ~BB();
virtual void f1(){ cout << "BB"<< endl; };
};//BB的虛擬函式表中的一個函式是~BB(),第二個是f1();
class DD : public BB{
public:
DD();
virtual ~DD(); //表中的第一個函式
virtual void f1(){ cout << "DD"<< endl; };//第二個
};
BB的虛擬函式表中的一個函式是~DD(),第二個是DD的f1();如果BB沒有定義f1()而定義了//virtual f2();則第二個函式是BB的f1(),第三個是f2();如果有以下的:
DD dd;
BB* pBB = ⅆ
pBB->f1(); //輸出的是"DD"
因為編譯器對pBB->f1() 不是直接CALL f1的地址,而是類似於:
mov ecx, d ptr [ebp-20h];//pBB變數的內容=類的首址=__vfptr的地址
mov edx, dword ptr [ecx]; //__vfptr的內容 = vtable的首地址
call dword ptr [edx+4] //呼叫虛擬函式表的第二個函式:就是dd.f1()
例如class CC{
public:
CC();
virtual ~CC();
virtual void f2(){cout << "CC" << endl;};
};
class DD: public BB, public CC{...}
有以下呼叫:
DD dd;
void* pCC = (CC*)ⅆ //關鍵在這一句!!!
BB* pBB = (BB*)pCC;
pBB->f1(); //竟然輸出是"cc",就是說呼叫的是CC::f2()!!!
這是因為:dd內有兩個__vfptr(一個是BB的,一個是CC的)分別在在dd資料空間的前兩位,都指向DD的虛擬函式表。 其實在第二句pCC指向的是第二個__vfptr(CC的),根據上面的程式碼,可知編譯器對pBB->f1()的解釋就是呼叫"那個"虛擬函式表的第二個函式(因為f1()在BB的第二個),而"那個"虛擬函式表現在已經是CC的了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001531/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++的動態繫結和靜態繫結C++
- java中的靜態繫結與動態繫結Java
- 理解靜態繫結與動態繫結
- 關於動態字串的繫結字串
- JAVA動態繫結淺析Java
- 三、動態繫結屬性
- 動態生成的html元素繫結click事件HTML事件
- vue 動態繫結 v-modelVue
- 動態繫結 input v-model
- Vue select 繫結動態變數Vue變數
- Vue 動態繫結CSS樣式VueCSS
- 構造器中呼叫動態繫結的方法
- 介面的繫結方案和動態SQLSQL
- class 和 style 資料動態繫結
- 域名繫結動態IP實戰案例
- jQuery實現DOM元素事件動態繫結jQuery事件
- Vue 框架-05-動態繫結 css 樣式Vue框架CSS
- 後期靜態繫結
- 05-v-bind動態繫結class(物件語法)物件
- 延遲靜態繫結——static
- php 後期靜態繫結PHP
- Vue一個案例引發的動態元件與全域性事件繫結總結Vue元件事件
- [轉帖]Redis如何繫結CPURedis
- 對 PHP 後期靜態繫結的理解PHP
- 【轉載】WPF中TreeView控制元件資料繫結和後臺動態新增資料(一)View控制元件
- SpringMVC的引數繫結-日期格式轉換SpringMVC
- 動態生成html元素繫結事件iphone失效問題解決HTML事件iPhone
- 使用 Hooks 簡化受控元件的狀態繫結Hook元件
- 後期靜態繫結在PHP中的使用PHP
- linux繫結多個ip(轉載)Linux
- 百度前端學院任務動態資料繫結(五)前端
- JQuery on()方法繫結動態元素的點選事件無響應的解決辦法jQuery事件
- PHP獲取動態跳轉後的真實連結PHP
- 在 Vue 中如何避免在動態繫結 類 出現空 類 的情況?Vue
- oracle 11g 新特性之動態繫結變數窺視(一)Oracle變數
- JS中動態新增元素並繫結事件,造成程式重複執行JS事件
- oracle 11g 新特性之動態繫結變數窺視(二)Oracle變數
- vue基礎-動態樣式&表單繫結&vue響應式原理Vue
- 2. Vue語法--插值操作&動態繫結屬性 詳解Vue