最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中虛表是什么意思(概念及示例)

 更新時(shí)間:2024年03月19日 08:55:45   作者:江水為竭  
虛函數(shù)表,以及虛函數(shù)指針是實(shí)現(xiàn)多態(tài)性(Polymorphism)的關(guān)鍵機(jī)制,這篇文章主要介紹了C++中虛表是什么意思(概念及示例),需要的朋友可以參考下

虛函數(shù)表,以及虛函數(shù)指針是實(shí)現(xiàn)多態(tài)性(Polymorphism)的關(guān)鍵機(jī)制。多態(tài)性允許我們通過基類的指針或引用來調(diào)用派生類的函數(shù)

定義

虛函數(shù)(Virtual Function)

  • 定義:類中使用virtual 關(guān)鍵字修飾的函數(shù) 叫做虛函數(shù)

  • 語法

highlighter- cpp

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

虛函數(shù)表(Virtual Function Table)

  • 定義:當(dāng)類含有至少一個(gè)虛函數(shù)時(shí),編譯器會(huì)為該類創(chuàng)建一個(gè)虛函數(shù)表。這個(gè)表是一個(gè)編譯時(shí)構(gòu)建的靜態(tài)數(shù)組,存儲(chǔ)了指向類中所有虛函數(shù)的指針。如果一個(gè)派生類重寫了這些函數(shù),那么在派生類的虛表中,相應(yīng)函數(shù)的指針會(huì)被更新為指向派生類中的版本。
  • 作用v-table使得在運(yùn)行時(shí)可以實(shí)現(xiàn)函數(shù)的動(dòng)態(tài)綁定,允許通過基類的指針或引用調(diào)用正確的函數(shù)版本。

虛函數(shù)指針(Virtual Pointer)

  • 定義:每個(gè)含有虛函數(shù)的類的對(duì)象(實(shí)例化出的)會(huì)持有一個(gè)指向相應(yīng)虛表的指針,這個(gè)指針通常被稱為虛指針(vptr)。vptr是對(duì)象運(yùn)行時(shí)的一部分,確保了當(dāng)通過基類指針調(diào)用虛函數(shù)時(shí),能夠查找到正確的函數(shù)實(shí)現(xiàn)。
  • 作用:在對(duì)象的生命周期開始時(shí),構(gòu)造函數(shù)會(huì)設(shè)置vptr以指向相應(yīng)的虛函數(shù)表。如果有派生類對(duì)象,它的構(gòu)造函數(shù)會(huì)更新vptr,以指向派生類的虛函數(shù)表。這保證了通過基類的引用或指針調(diào)用虛函數(shù)也會(huì)執(zhí)行最派生類的重寫版本。

示例

highlighter- cpp

#include <iostream>
using namespace std;
class Base {
public:
    virtual void func1() { cout << "Base::func1" << endl; }
    virtual void func2() { cout << "Base::func2" << endl; }
};
class Derived : public Base {
public:
    void func1() override { cout << "Derived::func1" << endl; }
    // func2() 繼承自 Base
};
void printVTable(void* obj) {
    cout << "vptr Address: " << obj << endl;
    void** vTable = *(void***)obj;
    cout << "VTable[0] (func1): " << vTable[0] << endl;
    cout << "VTable[1] (func2): " << vTable[1] << endl;
}
int main() {
    Base* base = new Base();
    Derived* derived = new Derived();
    cout << "Base object:" << endl;
    printVTable(base);
    cout << "\nDerived object:" << endl;
    printVTable(derived);
    delete base;
    delete derived;
    return 0;
}

程序輸出如下,可以看到?jīng)]用重寫的func2函數(shù)地址是一樣的。

highlighter- apache

Base object:
vptr Address: 0x8c1510   
VTable[0] (func1): 0x422270
VTable[1] (func2): 0x4222b0
Derived object:
vptr Address: 0x8c1530   
VTable[0] (func1): 0x422330
VTable[1] (func2): 0x4222b0

如下圖所示:

面試題

(來自2024騰訊實(shí)習(xí)面試)場(chǎng)景題:一個(gè)類 A,里面有一個(gè)打印 helloworld 的虛函數(shù),然后類 A 會(huì)在構(gòu)造函數(shù)里調(diào)用這個(gè)虛函數(shù),此時(shí)有個(gè)類 B,繼承A,重寫了這個(gè) helloworld虛函數(shù),問你在創(chuàng)建類 B 時(shí),會(huì)打印 A 里的 helloworld 還是 B 里的。

代碼如下:

highlighter- arduino

class A {
public:
    A() {
        print();
    }
    virtual void print() {
        cout << "A print" << endl;
    }
};
class B : public A {
public:
    void print() override {
        cout << "B print" << endl;
    }
};
int main() {
    A* aTemp = new B();
    delete aTemp;
}

解答:基類構(gòu)造函數(shù)執(zhí)行的時(shí)候,派生類的部分尚未初始化,因此調(diào)用的虛函數(shù)不會(huì)下發(fā)到派生類中。

最終會(huì)打印 A print,而不是類 B 里重寫的版本

到此這篇關(guān)于C++中虛表是什么的文章就介紹到這了,更多相關(guān)C++虛表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中構(gòu)造函數(shù)的初始化順序說明

    C++中構(gòu)造函數(shù)的初始化順序說明

    C++構(gòu)造函數(shù)調(diào)用遵循基類→成員對(duì)象→派生類順序,虛函數(shù)在構(gòu)造中靜態(tài)綁定,完成后動(dòng)態(tài)綁定,拷貝構(gòu)造在初始化、賦值及容器操作時(shí)調(diào)用,RVO優(yōu)化可能避免拷貝,虛函數(shù)重寫自子類起生效,不追溯基類
    2025-07-07
  • C++中頭文件的概念與基本編寫方法

    C++中頭文件的概念與基本編寫方法

    這篇文章主要介紹了C++中頭文件的概念與基本編寫方法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-12-12
  • Qt實(shí)現(xiàn)定時(shí)器的兩種方法分享

    Qt實(shí)現(xiàn)定時(shí)器的兩種方法分享

    這篇文章主要為大家詳細(xì)介紹了Qt中實(shí)現(xiàn)定時(shí)器的兩種不同方法,文中的示例代碼講解詳細(xì),對(duì)我們了解Qt有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • C++函數(shù)返回雙值的幾種方法

    C++函數(shù)返回雙值的幾種方法

    本文介紹了在C++和Qt開發(fā)中返回兩個(gè)double值的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • C語言求冪計(jì)算的高效解法

    C語言求冪計(jì)算的高效解法

    這篇文章主要介紹了C語言求冪計(jì)算的高效解法,分別演示了求冪運(yùn)算與整數(shù)次方的解法,具有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法(路徑規(guī)劃算法)

    C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法(路徑規(guī)劃算法)

    這篇文章主要介紹了C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點(diǎn)的建立和near與new之間的安全性檢查,需要的朋友可以參考下
    2022-05-05
  • C/C++程序開發(fā)中實(shí)現(xiàn)信息隱藏的三種類型

    C/C++程序開發(fā)中實(shí)現(xiàn)信息隱藏的三種類型

    這篇文章主要介紹了C/C++程序開發(fā)中實(shí)現(xiàn)信息隱藏的三種類型的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • C語言中二級(jí)指針的實(shí)例詳解

    C語言中二級(jí)指針的實(shí)例詳解

    這篇文章主要介紹了C語言中二級(jí)指針的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握理解二級(jí)指針的知識(shí),需要的朋友可以參考下
    2017-10-10
  • C++詳細(xì)實(shí)現(xiàn)紅黑樹流程詳解

    C++詳細(xì)實(shí)現(xiàn)紅黑樹流程詳解

    今天我要跟大家介紹二叉搜索樹中的另一顆樹——紅黑樹,它主要是通過控制顏色來控制自身的平衡,但它的平衡沒有AVL樹的平衡那么嚴(yán)格
    2022-06-06
  • QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)

    QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論

高台县| 舞钢市| 托克逊县| 北海市| 阿坝县| 伊春市| 锦州市| 拜城县| 凤山县| 紫金县| 买车| 马尔康县| 紫阳县| 德兴市| 丘北县| 庄河市| 邹城市| 峡江县| 南木林县| 潞城市| 普兰县| 新沂市| 沈阳市| 松原市| 定陶县| 南平市| 神农架林区| 徐汇区| 黎城县| 临夏县| 盐山县| 颍上县| 方正县| 黎川县| 松桃| 松原市| 德钦县| 三穗县| 南充市| 莱西市| 中阳县|