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

C++ 虛函數(shù)及虛函數(shù)表詳解

 更新時間:2021年11月03日 10:23:51   作者:dwell548560  
這篇文章主要介紹了c++ 虛函數(shù)及虛函數(shù)表詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

多態(tài)”的關(guān)鍵在于通過基類指針或引用調(diào)用一個虛函數(shù)時,編譯時不確定到底調(diào)用的是基類還是派生類的函數(shù),運(yùn)行時才確定。

#include <iostream>
using namespace std;
class A
{
public:
    int i;
    virtual void func() {}
    virtual void func2() {}
};
class B : public A
{
    int j;
    void func() {}
};
int main()
{
    cout << sizeof(A) << ", " << sizeof(B);  //輸出 8,12
    return 0;
}

 在 32 位編譯模式下,程序的運(yùn)行結(jié)果是:

8, 12

如果將程序中的 virtual 關(guān)鍵字去掉,輸出結(jié)果變?yōu)椋?br />

4, 8

A * p = new B() 實現(xiàn)多態(tài)

對比發(fā)現(xiàn),有了虛函數(shù)以后,對象所占用的存儲空間比沒有虛函數(shù)時多了 4 個字節(jié)。實際上,任何有虛函數(shù)的類及其派生類的對象都包含這多出來的 4 個字節(jié),這 4 個字節(jié)就是實現(xiàn)多態(tài)的關(guān)鍵——它位于對象存儲空間的最前端,其中存放的是虛函數(shù)表的地址。

每一個有虛函數(shù)的類(或有虛函數(shù)的類的派生類)都有一個虛函數(shù)表,該類的任何對象中都放著該虛函數(shù)表的指針(可以認(rèn)為這是由編譯器自動添加到構(gòu)造函數(shù)中的指令完成的)。 

沒有覆蓋時的子類,可以看到子類的虛函數(shù)表的前面是基類離得虛函數(shù)

有覆蓋就是

子類對象地址為什么能賦值給父類對象指針?

因為,子類對象地址賦值給父類對象指針,父類對象指針就指向了子類的對象空間,父類操作子類的范圍是有限制的,只能操作到子類中父類的范圍。

基類和子類各有自己的虛函數(shù)表vtbl;不管是基類還是子類實例都會在其內(nèi)存的開頭自動創(chuàng)對象即虛函數(shù)表指針vptr, 用來訪問所在類的虛函數(shù)表

想要實現(xiàn)多態(tài),需要動態(tài)綁定,需要父類的指針或父類的引用

父類方法為虛方法,子類覆蓋父類的虛方法,才能達(dá)到多態(tài)

子類中父類沒有的方法,父類指針也無法訪問到,父類指針只能訪問到父類自己有的范圍

子類要覆蓋父類的方法,就是要函數(shù)名參數(shù)都必須一樣才叫覆蓋

再看一個例子

class A {
public:
    virtual void vfunc1();
    virtual void vfunc2();
    void func1();
    void func2();
private:
    int m_data1, m_data2;
};
class B : public A {
public:
    virtual void vfunc1();
    void func1();
private:
    int m_data3;
};
class C: public B {
public:
    virtual void vfunc2();
    void func2();
private:
    int m_data1, m_data4;
};

子類繼承父類,子類中有父類的同名方法,訪問的是子類的方法,子類會隱藏父類所有的同名方法,即使父類有一個同名的參數(shù)不同的方法也是如此。 

多重繼承(無虛函數(shù)覆蓋)

下面,再讓我們來看看多重繼承中的情況,假設(shè)有下面這樣一個類的繼承關(guān)系。注意:子類并沒有覆蓋父類的函數(shù)。 

對于子類實例中的虛函數(shù)表,是下面這個樣子:

我們可以看到:

1)  每個父類都有自己的虛表。

2)  子類的成員函數(shù)被放到了第一個父類的表中。(所謂的第一個父類是按照聲明順序來判斷的) 

這樣做就是為了解決不同的父類類型的指針指向同一個子類實例,而能夠調(diào)用到實際的函數(shù)。 

多重繼承(有虛函數(shù)覆蓋) 

下面我們再來看看,如果發(fā)生虛函數(shù)覆蓋的情況。 

下圖中,我們在子類中覆蓋了父類的f()函數(shù)。 

下面是對于子類實例中的虛函數(shù)表的圖: 

我們可以看見,三個父類虛函數(shù)表中的f()的位置被替換成了子類的函數(shù)指針。這樣,我們就可以任一靜態(tài)類型的父類來指向子類,并調(diào)用子類的f()了。

任何妄圖使用父類指針想調(diào)用子類中的未覆蓋父類的成員函數(shù)的行為都會被編譯器視為非法,

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言示例講解結(jié)構(gòu)體的聲明與初始化方法

    C語言示例講解結(jié)構(gòu)體的聲明與初始化方法

    結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個成員可以是不同類型的變量。本文將通過示例為大家詳細(xì)講講C語言中結(jié)構(gòu)體的使用,需要的可以參考一下
    2022-07-07
  • 如何為Qt視圖中的文字實現(xiàn)彩虹漸變效果

    如何為Qt視圖中的文字實現(xiàn)彩虹漸變效果

    這篇文章主要給大家介紹了關(guān)于如何為Qt視圖中的文字實現(xiàn)彩虹漸變效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • linux c++ 服務(wù)器端開發(fā)面試必看書籍整理

    linux c++ 服務(wù)器端開發(fā)面試必看書籍整理

    這篇文章主要介紹了linux c++ 服務(wù)器端開發(fā)面試必看書籍整理,需要的朋友可以參考下
    2020-02-02
  • C++實現(xiàn)一個封裝的雙鏈表的完整代碼

    C++實現(xiàn)一個封裝的雙鏈表的完整代碼

    雙鏈表是鏈表的一種變種,除了每個節(jié)點指向下一個節(jié)點外,還多了一個指向前一個節(jié)點的指針,由于雙鏈表可以從兩端進(jìn)行遍歷,它的插入和刪除操作更為靈活,本文將詳細(xì)介紹如何使用 C++ 語言實現(xiàn)一個封裝的雙鏈表類,需要的朋友可以參考下
    2025-07-07
  • C語言關(guān)鍵字const和指針的結(jié)合使用

    C語言關(guān)鍵字const和指針的結(jié)合使用

    這篇文章主要介紹了C語言關(guān)鍵字const和指針的結(jié)合,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 關(guān)于C++靜態(tài)成員函數(shù)訪問非靜態(tài)成員變量的問題

    關(guān)于C++靜態(tài)成員函數(shù)訪問非靜態(tài)成員變量的問題

    靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員,這是因為靜態(tài)函數(shù)屬于類而不是屬于整個對象,靜態(tài)函數(shù)中的 member可能都沒有分配內(nèi)存。靜態(tài)成員函數(shù)沒有隱含的this自變量。所以,它就無法訪問自己類的非靜態(tài)成員
    2013-10-10
  • C++中的volatile關(guān)鍵字及其作用

    C++中的volatile關(guān)鍵字及其作用

    本文介紹了C++中的volatile關(guān)鍵字,它用于標(biāo)識變量可能被意外修改,以及編譯器不應(yīng)進(jìn)行優(yōu)化。本文通過具體的代碼示例,闡述了volatile關(guān)鍵字的作用和使用方法,幫助讀者更好地了解該關(guān)鍵字在C++語言中的應(yīng)用場景和實現(xiàn)原理
    2023-04-04
  • C++實現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計

    C++實現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言?程序的編譯系統(tǒng)解析

    C語言?程序的編譯系統(tǒng)解析

    編譯程序的基本功能是把源程序(高級語言)翻譯成目標(biāo)程序。但是,作為一個具有實際應(yīng)用價值的編譯系統(tǒng),除了基本功能之外,還應(yīng)具備語法檢查、調(diào)試措施、修改手段、覆蓋處理、目標(biāo)程序優(yōu)化、不同語言合用以及人-機(jī)聯(lián)系等重要功能
    2022-02-02
  • 簡述C++11就地初始化與列表初始化

    簡述C++11就地初始化與列表初始化

    這篇文章主要介紹了C++11就地初始化與列表初始化的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-08-08

最新評論

宁陕县| 军事| 云安县| 丽水市| 兴宁市| 象州县| 巴彦淖尔市| 兴安盟| 龙泉市| 临沭县| 巴林左旗| 湖北省| 大田县| 齐齐哈尔市| 甘泉县| 阳新县| 沽源县| 万盛区| 辽中县| 大足县| 侯马市| 库伦旗| 甘肃省| 周口市| 德令哈市| 金湖县| 朝阳区| 威远县| 徐汇区| 旬阳县| 普格县| 福鼎市| 策勒县| 忻城县| 高台县| 贡山| 曲阜市| 锡林浩特市| 县级市| 肃南| 隆化县|