虛擬函式表
阿新 • • 發佈:2020-09-18
原文地址:https://www.cnblogs.com/hushpa/p/5707475.html
1. 基礎知識:
(1) 32位os 指標長度為4位元組, 64位os 指標長度為8位元組, 下面的分析環境為64位 linux & g++ 4.8.4.
(2) new一個物件時, 只為類中成員變數分配空間, 物件之間共享成員函式。
2、程式碼
#include <iostream> 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: void g() {cout<<"derive::g"<<endl;} }; //可以稍後再看 int main () { cout<<"size of Base: "<<sizeof(Base)<<endl; typedefvoid(*Func)(void); Base b; Base *d = new Derive(); long* pvptr = (long*)d; long* vptr = (long*)*pvptr; Func f = (Func)vptr[0]; Func g = (Func)vptr[1]; Func h = (Func)vptr[2]; f(); g(); h(); return 0; }
C++中的多型是用虛擬函式實現的: 子類覆蓋父類的虛擬函式, 然後宣告一個指向子類物件的父類指標, 如Base *b = new Derive();
3 、虛擬函式表
包含虛擬函式的類才會有虛擬函式表, 同屬於一個類的物件共享虛擬函式表, 但是有各自的_vptr.
虛擬函式表實質是一個指標陣列,裡面存的是虛擬函式的函式指標。
Base中虛擬函式表結構:
Derive中虛擬函式表結構:
4、多繼承