虛擬函式的實現原理
首先虛擬函式是通過一張虛擬函式表來實現的,在加上虛擬函式關鍵字的時候 物件例項會增加虛擬函式表的指標!注意是表的指標 如果存表 那麼所有類都要加 會變得非常的大
這裡我們建了一個空類 可以發現這個空類大小是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++函式多型
- 虛擬函式,虛擬函式表函式
- 虛擬函式 純虛擬函式函式
- .Net 虛擬框架的實現原理框架
- 用虛擬函式實現事件驅動! (轉)函式事件
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- 虛擬函式函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- c++虛擬函式實現計算表示式子C++函式
- async 函式的實現原理函式
- bind 函式的實現原理函式
- [Lang] 虛擬函式函式
- C++中抽象類、虛擬函式和純虛擬函式C++抽象函式
- strlen函式的模擬實現函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- 我對C++中虛擬函式、純虛擬函式在實現多型中作用的一點淺薄認識 (轉)C++函式多型
- C++ 虛擬函式C++函式
- C++虛擬函式C++函式
- 虛擬函式釋義函式
- C++ 中的虛擬函式C++函式
- c++虛擬函式表C++函式
- C++虛擬函式bugC++函式
- 虛擬函式與多型函式多型
- React 虛擬Dom 轉成 真實Dom 實現原理React
- 函式節流、函式防抖實現原理分析函式
- C++中虛擬函式的作用C++函式
- angular髒檢查原理及虛擬碼實現Angular
- Java虛擬機器類裝載的原理及實現Java虛擬機
- C++虛擬函式與多型實戰 (轉)C++函式多型
- C++ 介面(純虛擬函式)C++函式
- C++ 虛擬函式表剖析C++函式
- const修飾虛擬函式函式
- [CareerCup] 13.3 Virtual Functions 虛擬函式Function函式
- C++ 虛擬函式表解析C++函式