1. 程式人生 > 實用技巧 >虛擬函式表

虛擬函式表

原文地址: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; typedef
void(*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();

當呼叫b->f()時, 呼叫的是子類的Derive::f()。

3 、虛擬函式表
包含虛擬函式的類才會有虛擬函式表, 同屬於一個類的物件共享虛擬函式表, 但是有各自的_vptr.
虛擬函式表實質是一個指標陣列,裡面存的是虛擬函式的函式指標。

Base中虛擬函式表結構:

Derive中虛擬函式表結構:

4、多繼承