C++虛函數(shù)、虛函數(shù)表玩裙、多態(tài)性

什么叫多態(tài)性兼贸?

A:同樣的消息被不同類型的對象接收時,對象會采用完全不同的行為處理消息吃溅。


多態(tài)
void play(HeroFighter *hf,EnemyFighter *ef){
        if (hf->power() > ef->attack())//hf->power()調(diào)用會發(fā)生多態(tài)
            cout<<"英雄勝"<<endl;
        else
            cout<<"英雄負"<<endl;
    }

    void main(int argc, char const *argv[])
    {
        HeroFighter hf;
        AdvHeroFighter ahf;
        EnemyFighter ef;
        play(&hf,&ef);
        play(&ahf,&ef);
    }
多態(tài)性有幾種溶诞?

A:靜態(tài)多態(tài)性(函數(shù)重載、運算符重載等)動態(tài)多態(tài)性(虛函數(shù))决侈。

什么是虛函數(shù)螺垢?

A:允許派生類重新定義與基類同名的函數(shù),并且可以通過基類指針或引用來訪問基類或派生類的同名函數(shù)赖歌。

當基類的成員函數(shù)被聲明為虛函數(shù)枉圃,那么子類的同名函數(shù)會是虛函數(shù)嗎

A:是滴,所以此時在聲明子類的虛函數(shù)不需要用vritual關(guān)鍵字庐冯,如果子類沒有對基類的虛函數(shù)進行重新定義孽亲,那么子類會直接繼承基類的虛函數(shù)

如何定義虛函數(shù)?

A:虛函數(shù)的函數(shù)名展父、參數(shù)列表必須相同墨林,返回值大多時候相同(特例:若基類返回值為該類的指針或引用赁酝,子類返回值為子類的指針或引用,那么此時系統(tǒng)會認為它們是同名虛函數(shù))

虛函數(shù)的訪問修飾符的界定

A:當基類的虛函數(shù)的訪問修飾符為public時旭等,無論子類的虛函數(shù)的訪問修飾符是什么,都可以通過基類的指針或引用為所有派生類調(diào)用函數(shù)衡载。

什么是純虛函數(shù)搔耕?

A:基類中虛函數(shù)只有聲明沒有實現(xiàn)體

virtual double Area() const=0;
什么是抽象類

A:含有純虛函數(shù)的類為抽象類,如果基類定義多個純虛函數(shù)痰娱,子類沒有一一將純虛函數(shù)實現(xiàn)弃榨,那么子類依舊也會被認為是抽象類。

為什么會有抽象類梨睁?

A:因為純虛函數(shù)不能被調(diào)用鲸睛,所以包含純虛函數(shù)的類是無法實例化的,那么這時候就出現(xiàn)了一個抽象類坡贺,它作為多個子類的共同基類官辈,就相當于給多個子類提供一個公共的接口,我們可以通過定義這個公共接口的指針或引用遍坟,指向派生類的某個對象拳亿,這樣就可以通過它來訪問派生類對象中的虛函數(shù)

什么是靜態(tài)聯(lián)編、動態(tài)聯(lián)編
  • 靜態(tài)聯(lián)編:是程序的匹配愿伴、連接在編譯階段實現(xiàn)肺魁,重載函數(shù)就是靜態(tài)聯(lián)編
  • 動態(tài)聯(lián)編:當程序運行到這一塊才進行聯(lián)編,如swich和if
虛函數(shù)表是如何實現(xiàn)的隔节?

先思考一個問題鹅经,編譯器是在什么時候?qū)崿F(xiàn)不同對象能調(diào)用同名函數(shù)綁定關(guān)系的?
創(chuàng)建對象的時候怎诫,編譯器偷偷給對象加了一個vptr指針瘾晃。只要我們類中定義了虛函數(shù),那么在實例化對象的時候刽虹,就會給對象添加一個vptr指針酗捌,類中創(chuàng)建的所有虛函數(shù)的地址都會放在一個虛函數(shù)表中,vptr指針就指向這個表的首地址涌哲。

虛函數(shù)的效率與普通函數(shù)比較

虛函數(shù)效率低胖缤,因為通過vptr指針調(diào)用重寫的函數(shù)是在程序運行時進行的,需要通過尋址操作找到該函數(shù)才能真正調(diào)用阀圾。而普通成員函數(shù)在編譯時就確定了調(diào)用的函數(shù)哪廓。

在構(gòu)造函數(shù)中定義虛函數(shù)會出現(xiàn)什么情況?

看以下代碼初烘,思考一下此時虛函數(shù)的調(diào)用

class Parent{
public:
    Parent(int a=0){
            this->a = a;
            print();}
    virtual void print(){cout<<"Parent"<<endl;}
private:
    int a;
};
class Son:public Parent{
    Son(int a=0,int b=0):Parent(a){
        this->b = b;
        print();}
    virtual void print(){cout<<"Son"<<endl;}
};
void main(int argc, char const *argv[]){
        Son s;
        return 0;
}

兩個類中構(gòu)造函數(shù)中涡真,都只會調(diào)用自己類中的print()函數(shù)分俯。
為什么呢?因為Son對象在實例化時哆料,先調(diào)用基類構(gòu)造函數(shù)缸剪,存在虛函數(shù),將vptr指向基類的虛函數(shù)表东亦,調(diào)用派生類構(gòu)造函數(shù)杏节,存在虛函數(shù),將vptr指向派生類的虛函數(shù)表典阵。所以都只會調(diào)用自己類中的虛函數(shù)奋渔。

如果子類重寫了父類的某一虛函數(shù),那么父類的該虛函數(shù)就被隱藏壮啊,無論以后怎么調(diào)用嫉鲸,調(diào)用同名虛函數(shù)調(diào)用的都是子類虛函數(shù)

重寫前

重寫后

為什么析構(gòu)函數(shù)經(jīng)常定義為虛析構(gòu)函數(shù)
虛析構(gòu)函數(shù):只有當一個類被定義為基類的時候,才會把析構(gòu)函數(shù)寫成虛析構(gòu)函數(shù)歹啼。
為什么一個類為基類玄渗,析構(gòu)函數(shù)就需要寫成虛析構(gòu)?
假設(shè)現(xiàn)在有一個基類指針染突,指向派生類捻爷。此時釋放基類指針,如果基類沒有虛析構(gòu)函數(shù)份企,此時只會看指針的數(shù)據(jù)類型也榄,而不會看指針指向的數(shù)據(jù)類型,所以此時會發(fā)生內(nèi)存泄露司志。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甜紫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骂远,更是在濱河造成了極大的恐慌囚霸,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件激才,死亡現(xiàn)場離奇詭異拓型,居然都是意外死亡,警方通過查閱死者的電腦和手機瘸恼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門劣挫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人东帅,你說我怎么就攤上這事压固。” “怎么了靠闭?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵帐我,是天一觀的道長坎炼。 經(jīng)常有香客問我,道長拦键,這世上最難降的妖魔是什么谣光? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮矿咕,結(jié)果婚禮上抢肛,老公的妹妹穿的比我還像新娘。我一直安慰自己碳柱,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布熬芜。 她就那樣靜靜地躺著莲镣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涎拉。 梳的紋絲不亂的頭發(fā)上瑞侮,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音鼓拧,去河邊找鬼半火。 笑死,一個胖子當著我的面吹牛季俩,可吹牛的內(nèi)容都是我干的钮糖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼酌住,長吁一口氣:“原來是場噩夢啊……” “哼店归!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酪我,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤消痛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后都哭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秩伞,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年欺矫,在試婚紗的時候發(fā)現(xiàn)自己被綠了纱新。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡汇陆,死狀恐怖怒炸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毡代,我是刑警寧澤阅羹,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布勺疼,位于F島的核電站,受9級特大地震影響捏鱼,放射性物質(zhì)發(fā)生泄漏执庐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一导梆、第九天 我趴在偏房一處隱蔽的房頂上張望轨淌。 院中可真熱鬧,春花似錦看尼、人聲如沸递鹉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躏结。三九已至,卻和暖如春狰域,著一層夾襖步出監(jiān)牢的瞬間媳拴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工兆览, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屈溉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓抬探,卻偏偏與公主長得像子巾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驶睦,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 1. 結(jié)構(gòu)體和共同體的區(qū)別砰左。 定義: 結(jié)構(gòu)體struct:把不同類型的數(shù)據(jù)組合成一個整體,自定義類型场航。共同體uni...
    breakfy閱讀 2,118評論 0 22
  • C++虛函數(shù) C++虛函數(shù)是多態(tài)性實現(xiàn)的重要方式缠导,當某個虛函數(shù)通過指針或者引用調(diào)用時,編譯器產(chǎn)生的代碼直到運行時才...
    小白將閱讀 1,732評論 4 19
  • 一個博客溉痢,這個博客記錄了他讀這本書的筆記僻造,總結(jié)得不錯『⒈《深度探索C++對象模型》筆記匯總 1. C++對象模型與內(nèi)...
    Mr希靈閱讀 5,571評論 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評論 1 51
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,334評論 8 265