首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 晚期繫結實戰:虛擬函式表機制與程式碼示範

     編輯:VC++

函式呼叫繫結:早期 vs 晚期

繫結:函式本體與呼叫點的關聯。編譯/連結階段完成為早期繫結 (C 語言唯一模式);執行期動態決定為晚期繫結 (動態繫結/執行期繫結)。

虛擬函式與晚期繫結機制

基類函式前加 virtual,告知編譯器採用晚期繫結,自動建構實作機制:

  1. 編譯器為每個含虛擬函式的類別建立虛擬函式表 (VTABLE),存放該類別虛擬函式位址
  2. 每個物件含虛擬指標 (VPTR),指向其類別的 VTABLE
  3. 透過基類指標呼叫函式時,編譯器靜態綁定子物件的 VPTR,執行期透過 VPTR 查表呼叫正確函式

完整程式碼示範

#include <typeinfo.h>
#include <iostream.h>

class Base {
public:
    virtual void f() { cout << "Base-print" << endl; }
};

class Derived : public Base {
public:
    void f() { cout << "Derived-print" << endl; }
};

void main() {
    Base* b;       // (1)
    Derived* d;    // (2)
    b = d;         // (3) 基類指標指向衍生類物件
    b->f();        // (4) 晚期繫結:呼叫 Derived::f()
}

執行結果

Derived-print

記憶體佈局圖解

b (Base*) → Derived 物件
    ├─ VPTR ──────────→ VTABLE (Derived)
    │                      ├─ f() → Derived::f()
    │                      └─ ...
    └─ Base 成員資料
        └─ Derived 成員資料

關鍵點:b = d 時,b 指向 Derived 物件開頭,其 VPTR 指向 Derived 的 VTABLE。呼叫 b->f() 時,編譯器產生間接呼叫碼:取 VPTR → 索引 VTABLE → 跳轉實際函式位址,實現多型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved