虛擬函式的實現原理
首先虛擬函式是通過一張虛擬函式表來實現的,在加上虛擬函式關鍵字的時候 物件例項會增加虛擬函式表的指標!注意是表的指標 如果存表 那麼所有類都要加 會變得非常的大
這裡我們建了一個空類 可以發現這個空類大小是1
(空類 編譯器會插入一個char 為了保證這個類的例項在記憶體中有唯一地址)
- 這裡大小變成了4個位元組 這4個位元組就是虛擬函式表的地址
-
這也說名物件存的是虛擬函式表的指標 不是表
虛擬函式表 這裡有三個虛擬函式
直接通過虛擬函式表找到虛擬函式
using namespace std;
class Base {
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
};
class derive : public Base {
public:
virtual void f() { cout << "derive Base::f" << endl; }
virtual void g() { cout << "derive Base::g" << endl; }
virtual void h() { cout << "derive Base::h" << endl; }
};
typedef void(*Fun)(void);
int main()
{
Base b;
derive der;
Fun pFun = NULL;
cout << "Virtual Address:" << (int*)(&b) << endl;
cout << "Virtual Table - First Funcation Address:" << (int*)*(int*)(&b) << endl;
int *pV_Address = (int*)(&b); //虛擬函式表的地址
int *pV_Table = (int *)*pV_Address; //虛擬函式的地址
pFun = (Fun)*pV_Table; //取虛擬函式
//pFun = (Fun)*((int*)*(int*)(&b));
pFun();
cout << "Virtual Address:" << (int*)(&der) << endl;
cout << "Virtual Table - First Funcation Address:" << (int*)*(int*)(&der) << endl;
pV_Address = (int*)(&der); //虛擬函式表的地址
pV_Table = (int *)*pV_Address; //虛擬函式的地址
pFun = (Fun)*pV_Table; //取虛擬函式
pFun();
system("pause");
return 0;
}
- 可以看到基類和派生類各自都有一張虛擬函式表
- 這樣就能保證虛擬函式在不同的類中能執行不同的函式
相關文章
- 虛擬函式表-C++多型的實現原理函式C++多型
- 虛擬函式的呼叫原理函式
- C++(虛擬函式實現多型基本原理)C++函式多型
- 虛擬函式,虛擬函式表函式
- 虛擬函式 純虛擬函式函式
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- c++虛擬函式實現計算表示式子C++函式
- bind 函式的實現原理函式
- async 函式的實現原理函式
- [Lang] 虛擬函式函式
- strlen函式的模擬實現函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- c++虛擬函式表C++函式
- 虛擬函式與多型函式多型
- 內聯(inline)函式與虛擬函式(virtual)的討論inline函式
- React 虛擬Dom 轉成 真實Dom 實現原理React
- angular髒檢查原理及虛擬碼實現Angular
- C++ 介面(純虛擬函式)C++函式
- C++ 虛擬函式表解析C++函式
- 深入C++成員函式及虛擬函式表C++函式
- 虛擬函式的記憶體佈局(上)函式記憶體
- 關於虛擬函式的一些理解函式
- C++多型之虛擬函式C++多型函式
- 抽象基類和純虛擬函式抽象函式
- Vue響應式原理與模擬實現Vue
- 模擬實現字串函式strlen , strcpy ,strcmp字串函式
- C++虛擬函式學習總結C++函式
- 細節解析 JavaScript 中 bind 函式的模擬實現JavaScript函式
- 虛擬現實技術
- C++之類解構函式為什麼是虛擬函式C++函式
- 深度解讀《深度探索C++物件模型》之C++虛擬函式實現分析(二)C++物件模型函式
- 深度解讀《深度探索C++物件模型》之C++虛擬函式實現分析(一)C++物件模型函式
- 深度解讀《深度探索C++物件模型》之C++虛擬函式實現分析(三)C++物件模型函式
- 基類指標、虛純虛擬函式、多型性、虛析構指標函式多型
- 虛擬現實還需要多久才能真正的實現
- setV:一個管理 Python 虛擬環境的 Bash 函式Python函式
- 詳解C++中的多型和虛擬函式C++多型函式