我們先實現一個基類
classBaseTest{private:virtualvoiddisplay(){cout<<"Basedisplay"<<endl;}voidsay(){cout<<"Basesay()"<<endl;}public:virtualvoidfunc(){cout<<"Basefunc()"<<endl;}voidexec(){display();say();}voidf1(stringa){cout<<"Basef1(string)"<<endl;}voidf1(inta){cout<<"Basef1(int)"<<endl;}voidexec2(){display();say();}};
BaseTest類中我們實現了一個虛函數display和 func。
BaseTest類內部重載了f1函數,實現了兩個版本,一個參數為string一個參數為int。
同一個類中的多個同名函數叫做重載。
實現了普通函數say,exec以及exec2函數。exec和exec2函數內部調用了display和say函數。
子類DeriveA繼承了基類
classDeriveA:publicBaseTest{public:voiddisplay(){cout<<"DeriveAdisplay()"<<endl;}voidf1(inta,intb){cout<<"DeriveAf1(int,int)"<<endl;}voidsay(){cout<<"DeriveAsay()"<<endl;}virtualvoidfunc(){cout<<"DeriveAfunc()"<<endl;}voiduse_base_f1(inta,intb){BaseTest::f1(2);BaseTest::f1("test");cout<<"DeriveAf1(int,int)"<<endl;}voidexec2(){display();say();}};
子類DeriveA 子類重新實現了display和func函數,子類重新實現父類的虛函數,叫做重寫。
同樣子類重新實現了f1和say函數,由于父類有f1和say,所以子類重新實現覆蓋了父類的函數,
這種普通函數被子類重寫導致父類的函數被隱藏了,叫做覆蓋。
接下來我們通過函數調用,看一下覆蓋,重載和重寫的區別
voidderive_base_test1(){DeriveAa;BaseTest*b=&a;shared_ptr<BaseTest>c=make_shared<BaseTest>();//輸出DeriveAfunc()b->func();//輸出DeriveAfunc()a.func();//輸出Basef1(string)b->f1("abc");//輸出Basef1(int)b->f1(3);//輸出DeriveAf1(int,int)a.f1(3,5);a.use_base_f1(2,4);cout<<"========================"<<endl;//輸出DeriveAdisplay()//輸出Basesay()b->exec();//輸出DeriveAdisplay()//輸出Basesay()a.exec();//輸出Basedisplay//輸出Basesay()c->exec();cout<<"========================\n"<<endl;//輸出DeriveAdisplay()//輸出Basesay()b->exec2();//輸出DeriveAdisplay()//輸出DeriveAsay()a.exec2();//輸出Basedisplay//輸出Basesay()c->exec2();}
代碼里我們生成了一個DeriveA的實例a, 并將該實例返回給基類BaseTest的指針b,所以:
1   b->func();會根據多態的效果調用子類DeriveA的func函數
2   a.func() 因為a是一個對象,所以調用子類DeriveA的func函數
3   b->f1(“abc”) 調用基類BaseTest的f1,因為f1是一個普通函數
4   a.f1(3, 5) 調用DeriveA的f1,因為a是一個普通對象。
5   當我們想在子類里調用基類的f1函數,可以通過基類作用域加函數名的方式,比如例子中的
a.use_base_f1就在函數內部通過BaseTest::f1調用了基類函數f1
6   b->exec,首先b是一個指針且exec為普通函數只在基類實現了,所以調用基類的exec,
但是exec內部調用了虛函數display,此時觸發多態機制調用DeriveA的display函數,因為b是一個指向子類DeriveA對象的基類BaseTest指針,exec內部調用了普通函數display,因為display不是虛函數,所以調用BaseTest的display函數
7   a.exec(); a是一個DeriveA對象,DeriveA自己沒有實現exec函數,所以調用基類BaseTest的exec函數,exec內部調用display虛函數時由于DeriveA重寫了display函數,所以調用DeriveA的display函數,exec內部調用say函數時由于say是普通函數,所以此時調用的是BaseTest的say函數。
8   c->exec(); 因為c為BaseTest類型,所以調用的就是BaseTest的exec,內部執行的也是BaseTest的display和say。
9  b->exec2(); 因為b是一個子類BaseTest的指針,所以調用BaseTest的exec2函數,exec2內部調用display時觸發多態機制調用DeriveA的display,調用say時因為say是普通函數,所以調用BaseTest的say函數。
10   a.exec2(); 因為a是DeriveA類對象,且DeriveA實現了exec2,所以a調用DeriveA的exec2,這樣exec2內部調用的都是DeriveA的say和display
11   c->exec2(); c為BaseTest類對象,所以調用BaseTest類的exec2以及display和say函數。
考察一個函數是被子類還是基類調用時應該分以下幾種情況
1  該函數是虛函數并且被子類重寫,如果是基類指針指向子類對象,調用該函數則引發多態機制,調用子類的虛函數
2   如果該函數時虛函數并且沒有被重寫,那么無論調用的對象是基類指針還是子類對象,還是基類對象,
還是子類指針都是調用基類的這個虛函數
3   如果該函數不是虛函數,如果該函數被子類覆蓋(子類重新定義了同名函數),那么調用規則就是子類調用子類的該函數,
基類調用該基類的函數。
4   如果該函數不是虛函數,并且子類沒有定義同名函數(沒有覆蓋基類同名函數),那么無論是子類還是基類的指針或者對象,
統一調用的是基類的函數。
5   如果第4點里基類的函數(沒有被子類覆蓋),但是內部調用了基類的虛函數,并且該虛函數被子類重寫,這時內部這個虛函數調用規則
就要看調用對象的實際類型,符合1的調用標準,多態就走子類,不是多態就走基類(此時符合2標準)
6  如果第3點里基類的函數(被子類覆蓋),但是內部調用了基類的虛函數,并且該虛函數被子類重寫,這時內部這個虛函數調用規則
就要看調用對象的實際類型,符合1的調用標準,多態就走子類,不是多態就走基類(此時符合2標準)
“C++重載重寫覆蓋的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注本站網站,小編將為大家輸出更多高質量的實用文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
銀聯在線信用卡還款怎么做?你知道還信用卡最好的方式是哪兩種嗎?一起來看看。還信用卡最好的方式有兩種:手機銀行還款和銀聯云閃付還款。一、通過手機銀行APP還款登陸發卡行的手機銀行APP,進入信用卡界面,可查詢到本人名下在這家銀行全部信用卡賬單。以中國銀行手機銀行為例:進入首頁后,點擊“信用卡還款”,進入信用卡還款主界面。選擇需要償還的信用卡,系統自動顯示信用卡賬單金額。分&l...
淘寶賬號被凍結是為什么?(1)淘寶商家賬號正常情況之下,都是在有驗證違規的情況之下才會進行解凍,在凍結期間,你是無法對商品寶貝進行編輯。而且還會根據不同違規類型所需要凍結時間和扣分情況,出現略有不同。(2)多數情況,基本都是因為店鋪的b類違規扣分導致的凍結,或者是你已經累計超過48分、c類扣分已經是達到48分情況導致。(3)通常都是在分為:發布違禁信息、盜用他人賬號、騙取他人財物、出售假冒偽劣商品...
全球第一大互聯網公司是哪家?全球第一大互聯網公司叫亞馬遜??偛吭O在西雅圖的亞馬遜,成立于1995年,是一家依托互聯網的電子商務企業,開始在網上賣書,現在已經發展成為產品門類最全、創意最多的零售商家。眾所周知,亞馬遜開始在線上,賣書,通過低價獲得了大量用戶,并逐漸搶占了美國零售市場的市場份額,此后,亞馬遜不斷擴大商品類別,成為線上電子商務平臺。與此同時,亞馬遜擴展并建立了第三方賣家平臺makes,使...