91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

c++ vptr如何實現虛函數調用

c++
小樊
84
2024-09-04 18:18:06
欄目: 編程語言

在C++中,虛函數的調用是通過虛指針(vptr)和虛表(vtable)來實現的。當一個類含有虛函數時,編譯器會為這個類創建一個虛表,虛表中存放著虛函數的地址。同時,編譯器會在類的實例中添加一個指向虛表的指針(vptr)。當調用虛函數時,程序會通過對象的vptr找到虛表,然后在虛表中查找并調用相應的虛函數。

以下是虛函數調用的實現過程:

  1. 編譯器為每個包含虛函數的類創建一個虛表(vtable)。虛表中存放著虛函數的地址,按照虛函數在類中的聲明順序排列。

  2. 編譯器在類的實例中添加一個指向虛表的指針(vptr)。vptr通常位于對象實例的內存布局的開始位置,這樣可以保證訪問vptr的代價最小。

  3. 當調用虛函數時,首先通過對象的vptr找到虛表。然后在虛表中根據虛函數的索引(即在類中聲明的順序)查找到虛函數的地址。最后,調用找到的虛函數。

以下是一個簡單的示例,展示了虛函數調用的實現過程:

#include<iostream>

class Base {
public:
    virtual void foo() {
        std::cout << "Base::foo()"<< std::endl;
    }
};

class Derived : public Base {
public:
    void foo() override {
        std::cout << "Derived::foo()"<< std::endl;
    }
};

int main() {
    Base* base_ptr = new Derived();
    base_ptr->foo(); // 輸出 "Derived::foo()"
    delete base_ptr;
    return 0;
}

在這個示例中,Base類包含一個虛函數foo()Derived類重寫了這個虛函數。當我們通過Base類的指針調用foo()時,程序會通過base_ptr的vptr找到Derived類的虛表,然后在虛表中查找并調用Derived::foo()

0
红河县| 彰武县| 顺平县| 金昌市| 项城市| 阳江市| 桃源县| 孙吴县| 阳高县| 永昌县| 新龙县| 威远县| 曲阜市| 临猗县| 常宁市| 福州市| 赤水市| 乐亭县| 石台县| 汝南县| 通化市| 铜鼓县| 汕头市| 日土县| 玉田县| 乌审旗| 景宁| 孙吴县| 固阳县| 饶河县| 旌德县| 林口县| 区。| 五峰| 汶川县| 即墨市| 绩溪县| 兴隆县| 丹凤县| 来宾市| 浦城县|