GeekBand-C++面向?qū)ο蟾呒?jí)編程(下)-Week2

對(duì)象模型:虛函數(shù)表(vtbl)與虛表指針(vptr)

class A {
    virtual void func() {
        std::cout << "A::func()" << std::endl;
    }
};

class B : public A {
    virtual void func() {
        std::cout << "B::func()" << std::endl;
    }
};

int main() {
    A *p = new B;
    p->func();    // 輸出結(jié)果: B::func()
    return 0;
}

我們知道贺拣,C++中,可以通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)多態(tài)性矗愧,而虛函數(shù)是通過(guò)虛函數(shù)表與虛表指針來(lái)進(jìn)行實(shí)現(xiàn)的御吞。
對(duì)于每個(gè)擁有虛函數(shù)的類來(lái)說(shuō),在創(chuàng)建對(duì)象時(shí)瓦哎,除了為對(duì)象的成員變量開(kāi)辟內(nèi)存空間砸喻,還會(huì)在對(duì)象的頭部存儲(chǔ)一個(gè)虛表指針,用于指向一張?zhí)摵瘮?shù)表蒋譬,這張函數(shù)表中存儲(chǔ)了這個(gè)對(duì)象的虛函數(shù)地址割岛。這樣一來(lái),當(dāng)我們要調(diào)用這個(gè)對(duì)象的虛函數(shù)時(shí)羡铲,就會(huì)通過(guò)這張?zhí)摵瘮?shù)表來(lái)查找到相應(yīng)的虛函數(shù)蜂桶,因此,即是我們是通過(guò)對(duì)象的父類指針來(lái)進(jìn)行調(diào)用也切,也能夠調(diào)用到對(duì)象真正的類型中的函數(shù)扑媚,因?yàn)楹瘮?shù)是儲(chǔ)存在對(duì)象中的。

繼承關(guān)系
虛函數(shù)表

通過(guò)這種方式雷恃,C++實(shí)現(xiàn)了多態(tài)疆股。對(duì)于虛函數(shù)的存儲(chǔ)方式,當(dāng)我們進(jìn)行多重繼承時(shí)倒槐,會(huì)有所不同旬痹。

多重繼承
多重繼承時(shí)的虛函數(shù)表

重寫(xiě)(override)

在C++11中,增加了一個(gè)用在虛函數(shù)身上的關(guān)鍵字:override

class A {
    virtual void func() {
        std::cout << "A::func()" << std::endl;
    }
};

class B : public A {
    virtual void func() override {
        std::cout << "B::func()" << std::endl;
    }
};

如上所示讨越,這個(gè)關(guān)鍵字可以加在虛函數(shù)尾两残,用來(lái)表示這個(gè)函數(shù)對(duì)父類的同名函數(shù)構(gòu)成override,編譯器會(huì)幫忙檢查是否真的構(gòu)成override把跨,如果沒(méi)有人弓,則編譯時(shí)會(huì)報(bào)錯(cuò),這有助于發(fā)現(xiàn)編碼中的錯(cuò)誤着逐。

重寫(xiě)崔赌、重載意蛀、隱藏

class A {
    virtual void func() {
        std::cout << "A::func()" << std::endl;
    }
    virtual void func(int a) {
        std::cout << "A::func(int)" << std::endl;
    }
};

class B : public A {
    virtual void func(double a) override { // error
        std::cout << "B::func(double)" << std::endl;
    }
};

如上所示,這種情況其實(shí)不構(gòu)成override健芭,會(huì)編譯報(bào)錯(cuò)县钥。此時(shí)A類的func(int a)對(duì)func()構(gòu)成重載,而B(niǎo)類的func(double a)對(duì)A類的兩個(gè)func形成了函數(shù)隱藏慈迈,通過(guò)B類將無(wú)法訪問(wèn)A類的兩個(gè)func若贮。

this指針

通過(guò)對(duì)象調(diào)用對(duì)象身上的方法,此時(shí)函數(shù)體本身如何知道該對(duì)哪個(gè)對(duì)象進(jìn)行操作吩翻?此時(shí)函數(shù)體靠的就是this指針來(lái)識(shí)別是對(duì)哪個(gè)對(duì)象進(jìn)行操作兜看。對(duì)象在調(diào)用成員方法時(shí),會(huì)自動(dòng)將自己作為this指針傳入成員函數(shù)狭瞎,從而使函數(shù)能夠?qū)@個(gè)對(duì)象進(jìn)行操作细移。類的static函數(shù)沒(méi)有傳入this指針,所以static函數(shù)不能操作成員變量熊锭,只能操作類的靜態(tài)變量弧轧。

class A {
    void func1() const {}
    void func2() volatile {}
    static void func3() const {} // error
};

我們可以通過(guò)指定一個(gè)函數(shù)為const來(lái)表示這個(gè)函數(shù)不會(huì)修改對(duì)象內(nèi)容,其原理就是加上const之后傳入的this指針是const的碗殷,因此就無(wú)法通過(guò)這個(gè)this指針來(lái)修改對(duì)象的成員變量了精绎。同理,函數(shù)后加volatile的實(shí)現(xiàn)原理也是this指針是volatile的锌妻。static函數(shù)后面加const會(huì)編譯報(bào)錯(cuò)代乃,就是因?yàn)閟tatic函數(shù)沒(méi)有this指針的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仿粹,一起剝皮案震驚了整個(gè)濱河市搁吓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吭历,老刑警劉巖堕仔,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晌区,居然都是意外死亡摩骨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門朗若,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恼五,“玉大人,你說(shuō)我怎么就攤上這事哭懈』礁裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵银伟,是天一觀的道長(zhǎng)你虹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)彤避,這世上最難降的妖魔是什么傅物? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮琉预,結(jié)果婚禮上董饰,老公的妹妹穿的比我還像新娘。我一直安慰自己圆米,他們只是感情好卒暂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著娄帖,像睡著了一般也祠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上近速,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天诈嘿,我揣著相機(jī)與錄音,去河邊找鬼削葱。 笑死奖亚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的析砸。 我是一名探鬼主播昔字,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼首繁!你這毒婦竟也來(lái)了作郭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛮瞄,失蹤者是張志新(化名)和其女友劉穎所坯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挂捅,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芹助,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闲先。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片状土。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伺糠,靈堂內(nèi)的尸體忽然破棺而出蒙谓,到底是詐尸還是另有隱情,我是刑警寧澤训桶,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布累驮,位于F島的核電站酣倾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谤专。R本人自食惡果不足惜躁锡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望置侍。 院中可真熱鬧映之,春花似錦、人聲如沸蜡坊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秕衙。三九已至蠢甲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灾梦,已是汗流浹背峡钓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留若河,地道東北人能岩。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像萧福,于是被迫代替她去往敵國(guó)和親拉鹃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容