c++的virtual和override作用及說明
一、概述
c++的virtual提供了運(yùn)行時(shí)的多態(tài),可以用基類的指針調(diào)用子類對(duì)象的函數(shù),通過override可以強(qiáng)制要求基類有對(duì)應(yīng)的虛函數(shù)。
二、測(cè)試代碼
#pragma once #include <stdio.h> class Base { public: ?? ?void A_1()? ?? ?{ ?? ??? ?printf("Base::A_1\n"); ?? ?}; ?? ?virtual void A_2()? ?? ?{ ?? ??? ?printf("Base::A_2\n"); ?? ?} ?? ?virtual void A_3()? ?? ?{ ?? ??? ?printf("Base::A_3\n"); ?? ?} ?? ?virtual void A_4() ?? ?{ ?? ??? ?printf("Base::A_4\n"); ?? ?} ?? ?void A_5()? ?? ?{ ?? ??? ?printf("Base::A_5\n"); ?? ?} }; class Drived : public Base { public: ?? ?void A_1() //覆蓋了基類的函數(shù),用基類指針調(diào)用時(shí)調(diào)用到的時(shí)基類的A_1,用子類指針調(diào)用時(shí)調(diào)用到的時(shí)子類的A_1 ?? ?{ ?? ??? ?printf("Drived::A_1\n"); ?? ?}; ?? ?virtual void A_2() //用基類或子類指針都調(diào)用到的是子類的A_2,之類的virtual說明的是是子類的A_2還可以被virtual ?? ?{ ?? ??? ?printf("Drived::A_2\n"); ?? ?} ?? ?void A_3() //用基類或子類指針都調(diào)用到的是子類的A_2 ?? ?{ ?? ??? ?printf("Drived::A_3\n"); ?? ?} ?? ?virtual void A_4() override //子類加上override,如果基類沒有對(duì)應(yīng)virtual函數(shù)就會(huì)編譯錯(cuò)誤。避免拼錯(cuò)和記錯(cuò)沒有重寫基類函數(shù) ?? ?{ ?? ??? ?printf("Drived::A_4\n"); ?? ?} ?? ?/* ?? ?void A_5() override //編譯錯(cuò)誤 'Drived::A_5': method with override specifier 'override' did not override any base class methods?? ? ?? ?{? ?? ??? ?printf("Drived::A_5\n"); ?? ?} ?? ?*/ }; class Drived2 : public Drived { public: ?? ?void A_2() override? ?? ?{ ?? ??? ?printf("Drived2::A_2\n"); ?? ?} ?? ?void A_3() ?override//用基類或子類指針都調(diào)用到的是子類的A_2 ?? ?{ ?? ??? ?printf("Drived2::A_3\n"); ?? ?} }; class VirtualTest { public: ?? ?void DoTest() ?? ?{ ?? ??? ?Drived *drived = new Drived(); ?? ??? ?Base *base = drived; ?? ??? ?base->A_1(); ?? ??? ?drived->A_1(); ?? ??? ?printf("\n"); ?? ??? ?base->A_2(); ?? ??? ?drived->A_2(); ?? ??? ?printf("\n"); ?? ??? ?base->A_3(); ?? ??? ?drived->A_3(); ?? ??? ?printf("\n"); ?? ??? ?base->A_4(); ?? ??? ?drived->A_4(); ?? ??? ?printf("\n"); ?? ??? ?Drived2 *drived2 = new Drived2(); ?? ??? ?base = drived2; ?? ??? ?drived = drived2; ?? ??? ? ?? ??? ?base->A_2(); ?? ??? ?drived->A_2(); ?? ??? ?drived2->A_2(); ?? ??? ?printf("\n"); ?? ??? ?base->A_3(); ?? ??? ?drived->A_3(); ?? ??? ?drived2->A_3(); ?? ?} };
三、輸出
Base::A_1
Drived::A_1Drived::A_2
Drived::A_2Drived::A_3
Drived::A_3Drived::A_4
Drived::A_4Drived2::A_2
Drived2::A_2
Drived2::A_2Drived2::A_3
Drived2::A_3
Drived2::A_3
四、總結(jié)
1、基類函數(shù)沒加virtual,子類有相同函數(shù),實(shí)現(xiàn)的是覆蓋。用基類指針調(diào)用時(shí),調(diào)用到的是基類的函數(shù);用子類指針調(diào)用時(shí),調(diào)用到的是子類的函數(shù)。
2、基類函數(shù)加了virtual時(shí),實(shí)現(xiàn)的時(shí)重寫。用基類指針或子類指針調(diào)用時(shí),調(diào)用到的都是子類的函數(shù)。
3、函數(shù)加上override,強(qiáng)制要求基本相同函數(shù)需要是虛函數(shù),否則會(huì)編譯報(bào)錯(cuò)。
4、子類的virtual可加可不加,建議加override不加virtual。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言的隨機(jī)數(shù)rand()函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的隨機(jī)數(shù)rand()函數(shù),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02C語(yǔ)言實(shí)現(xiàn)從文件讀入一個(gè)3*3數(shù)組,并計(jì)算每行的平均值
今天小編就為大家分享一篇C語(yǔ)言實(shí)現(xiàn)從文件讀入一個(gè)3*3數(shù)組,并計(jì)算每行的平均值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12

C++數(shù)據(jù)結(jié)構(gòu)分析多態(tài)的實(shí)現(xiàn)與原理及抽象類

C語(yǔ)言冷知識(shí)之預(yù)處理字符串操作符詳解