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

C++虛函數(shù)注意事項(xiàng)

 更新時(shí)間:2022年01月25日 16:42:15   作者:?梁唐  
這篇文章主要給大家分享了EC++虛函數(shù)注意事項(xiàng),

文章轉(zhuǎn)自公眾號(hào):Coder梁(ID:Coder_LT)

一、虛函數(shù)注意事項(xiàng)

在之前的文章當(dāng)中,我們已經(jīng)討論了虛函數(shù)的使用方法,也對(duì)它的原理進(jìn)行了簡(jiǎn)單的介紹。

這里簡(jiǎn)單做一個(gè)總結(jié):

  • 在基類的方法聲明中使用關(guān)鍵字virtual可以聲明虛函數(shù)
  • 加上了virtual關(guān)鍵字的函數(shù)在基類以及派生類和派生類再派生出來(lái)的類中都是虛的
  • 在調(diào)用虛函數(shù)時(shí),程序?qū)?huì)根據(jù)對(duì)象的類型執(zhí)行對(duì)應(yīng)的方法而非引用或指針的類型
  • 在定義基類時(shí),需要將要在派生類中重新定義的類方法聲明為虛,如析構(gòu)函數(shù)

除了這些之外,我們還有一些其他需要注意的事項(xiàng)。

1.構(gòu)造函數(shù)

構(gòu)造函數(shù)不能是虛函數(shù),創(chuàng)建派生類對(duì)象時(shí)將調(diào)用派生類的構(gòu)造函數(shù),而非基類的構(gòu)造函數(shù),畢竟構(gòu)造函數(shù)是根據(jù)類名調(diào)用的。

一般我們會(huì)在派生類中調(diào)用基類的構(gòu)造函數(shù),這其實(shí)不是繼承機(jī)制,所以將類構(gòu)造函數(shù)聲明為虛沒(méi)有意義。

2.析構(gòu)函數(shù)

前文說(shuō)過(guò)析構(gòu)函數(shù)應(yīng)該是虛函數(shù),除非類不被繼承。

因?yàn)榕缮惍?dāng)中往往含有獨(dú)有的成員變量,如果析構(gòu)函數(shù)非虛,那么會(huì)導(dǎo)致在對(duì)象析構(gòu)時(shí)僅調(diào)用基類的析構(gòu)函數(shù),從而導(dǎo)致獨(dú)有的成員變量?jī)?nèi)存不被釋放,引起內(nèi)存泄漏。

所以通常我們會(huì)將析構(gòu)函數(shù)設(shè)置成virtual,即使不用做基類也不會(huì)引起錯(cuò)誤,至多只會(huì)影響一點(diǎn)效率。但在大型合作開(kāi)發(fā)的項(xiàng)目當(dāng)中,許多組件和類都是共享的,我們往往無(wú)法保證我們開(kāi)發(fā)的類是否會(huì)被其他開(kāi)發(fā)者繼承,因此設(shè)置虛析構(gòu)函數(shù)也是一種常規(guī)做法。

3.友元

友元函數(shù)不能是虛函數(shù),因?yàn)橛言皇穷惓蓡T,只有成員函數(shù)才能是虛函數(shù)。

如果我們希望友元函數(shù)也能實(shí)現(xiàn)類似虛函數(shù)的功能, 我們可以在友元函數(shù)當(dāng)中使用虛函數(shù)來(lái)解決。

4.沒(méi)有重新定義

如果派生類當(dāng)中沒(méi)有重新定義虛函數(shù),那么將使用該函數(shù)的基類版本。如果派生類位于派生鏈中,如B繼承了A,C繼承了B這種情況,那么派生類將會(huì)使用最新的虛函數(shù)版本。

5.重新定義將隱藏方法

我們來(lái)看一個(gè)例子:

class Mammal {
?private:
? string name;
?public:
? Mammal(string n): name(n) {}
? virtual void speak() const {
? ?cout << "can't say anything" << endl;
? }
};

class Human : public Mammal{
?private:
? string job;
?public:
? Human(string n, string j): Mammal(n), job(j) {}
? virtual void speak(const string st) const {
? ?cout << "i'm human" << endl;
? }
};

我們?cè)诟割惍?dāng)中定義了一個(gè)無(wú)參虛函數(shù)speak,而在子類Human當(dāng)中也定義了一個(gè)需要傳入一個(gè)string類型的虛函數(shù)speak。

我試了一下,在我的g++編譯器當(dāng)中,會(huì)報(bào)錯(cuò):

但根據(jù)C++ Primer中的說(shuō)法,在一些古老的編譯器當(dāng)中,可能不會(huì)報(bào)錯(cuò),甚至可能連警告都沒(méi)有。

在這類編譯器當(dāng)中,我們重新定義父類中的虛函數(shù),這樣的重新定義不會(huì)生成兩個(gè)重載版本,而是隱藏了父類無(wú)參的版本,只保留了接受string類型的版本,這種情況有別于函數(shù)重載。

在派生類當(dāng)中重新定義函數(shù),不是使用相同的函數(shù)特征標(biāo)覆蓋基類聲明,而是隱藏同名的基類方法,不管函數(shù)特征標(biāo)如何。

C++ Primer當(dāng)中給出了兩條經(jīng)驗(yàn)規(guī)則:

如果重新定義繼承的方法,應(yīng)該保證與原來(lái)的原型完全相同,唯一的例外是返回的類型,如果基類返回的是基類的引用或指針,派生類可以改成派生類的引用或指針:

class Mammal {
?private:
? string name;
?public:
? Mammal(string n): name(n) {}
? virtual Mammal* build();
};

class Human : public Mammal{
?private:
? string job;
?public:
? Human(string n, string j): Mammal(n), job(j) {}
? virtual Human* build();
};

如果基類聲明被重載了,那么應(yīng)該在派生類中聲明所有的基類版本:
 

class Mammal {
?private:
? string name;
?public:
? Mammal(string n): name(n) {}
? virtual void speak() const ;
? ? ?virtual void speak(int n) const;
? ? ?virtual void speak(const string st) const;
};

class Human : public Mammal{
?private:
? string job;
?public:
? Human(string n, string j): Mammal(n), job(j) {}
? virtual void speak() const ;
? ? ?virtual void speak(int n) const;
? ? ?virtual void speak(const string st) const;
};

如果我們只重新定義了一個(gè)版本,那么另外兩個(gè)版本將隱藏。

但這可能和編譯器版本有關(guān),在新版的編譯器當(dāng)中似乎取消了這一設(shè)定。

我嘗試了一下,發(fā)現(xiàn)并不會(huì)隱藏,一樣可以順利調(diào)用父類方法。

class Mammal {
?private:
? string name;
?public:
? Mammal(string n): name(n) {}
? virtual void speak() const {
? ?cout << "can't say anything from empty" << endl;
? }
? virtual void speak(const string st) const {
? ?cout << "can't say anything from string input" << endl;
? }
};

class Human : public Mammal{
?private:
? string job;
?public:
? Human(string n, string j): Mammal(n), job(j) {}
? virtual void speak(const string st) const {
? ?cout << "i'm human" << endl;
? }
};

int main() {
?Mammal *m = new Human("man", "spiderman");
?m->speak();
?return 0;
}

到此這篇關(guān)于EC++虛函數(shù)注意事項(xiàng)的文章就介紹到這了,更多相關(guān)EC++虛函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊的方法

    使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊的方法

    這篇文章主要介紹了?使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊,代碼分為服務(wù)器代碼和客戶端代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C語(yǔ)言編程題楊氏矩陣算法快速上手示例詳解

    C語(yǔ)言編程題楊氏矩陣算法快速上手示例詳解

    這篇文章主要為大家介紹了C語(yǔ)言編程題楊氏矩陣算法快速上手的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • 一文讀懂C++中Protobuf

    一文讀懂C++中Protobuf

    Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化、或者說(shuō)序列化,本文詳解了Protobuf的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • 基于C語(yǔ)言實(shí)現(xiàn)shell指令的詳解

    基于C語(yǔ)言實(shí)現(xiàn)shell指令的詳解

    本篇文章是對(duì)C語(yǔ)言實(shí)現(xiàn)shell指令的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++日期類運(yùn)算符重載方式

    C++日期類運(yùn)算符重載方式

    這篇文章主要介紹了C++日期類運(yùn)算符重載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)

    C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)的相關(guān)資料,這里提供實(shí)例代碼來(lái)幫助大家理解掌握二叉樹(shù),需要的朋友可以參考下
    2017-07-07
  • C++設(shè)計(jì)模式之適配器模式(Adapter)

    C++設(shè)計(jì)模式之適配器模式(Adapter)

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之適配器模式Adapter,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C++11智能指針unique_ptr用法使用場(chǎng)景分析

    C++11智能指針unique_ptr用法使用場(chǎng)景分析

    unique_ptr 是 C++ 11 提供的用于防止內(nèi)存泄漏的智能指針中的一種實(shí)現(xiàn),即使在異常發(fā)生時(shí)也可幫助避免資源泄露。這篇文章主要介紹了C++11智能指針unique_ptr用法介紹,需要的朋友可以參考下
    2021-08-08
  • C 語(yǔ)言基礎(chǔ)之初識(shí) C 語(yǔ)言常量

    C 語(yǔ)言基礎(chǔ)之初識(shí) C 語(yǔ)言常量

    C語(yǔ)言中的常量分為以下幾種:字面常量、const修飾的常變量、#define定義的標(biāo)識(shí)符常量等,下面我們將詳細(xì)對(duì)C語(yǔ)言這幾個(gè)常量做介紹,感興趣的小伙伴可以參考一下
    2021-09-09
  • c++語(yǔ)言中虛函數(shù)實(shí)現(xiàn)多態(tài)的原理詳解

    c++語(yǔ)言中虛函數(shù)實(shí)現(xiàn)多態(tài)的原理詳解

    這篇文章主要給大家介紹了關(guān)于c++語(yǔ)言中虛函數(shù)實(shí)現(xiàn)多態(tài)的原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論

汉寿县| 饶河县| 高雄县| 曲水县| 恩施市| 龙山县| 个旧市| 无锡市| 广昌县| 东兴市| 德江县| 封开县| 邵阳市| 永泰县| 舞阳县| 通化市| 波密县| 灵石县| 西安市| 咸宁市| 宝山区| 南投市| 四会市| 静安区| 南开区| 澎湖县| 荣成市| 六安市| 迁安市| 江西省| 青浦区| 雷州市| 同仁县| 公安县| 余庆县| 静乐县| 海阳市| 新晃| 云林县| 宁海县| 鄂温|