C++中關(guān)鍵字 override 的簡析
在C++中,虛函數(shù)是最常見的實(shí)現(xiàn)多態(tài)的機(jī)制之一,來個(gè)最簡單的例子溫習(xí)一下:
class Base // 基類
{
public:
virtual void f(){cout << "Base::f()" << endl;}
};
class Derived1 : public Base // 派生類1
{
virtual void f(){cout << "Derived1::f()" << endl;}
};
class Derived2 : public Base // 派生類2
{
virtual void f(){cout << "Derived2::f()" << endl;}
};
以上是一個(gè)基類 Base 及其派生子類的最簡示例,基類中有一個(gè)普通虛函數(shù) f( ),并且派生類們都復(fù)寫(即override)了該虛函數(shù)。
以上代碼的含義再清楚不過:我們希望通過基類指針或者基類引用,可以調(diào)用派生類版本的函數(shù) f( ),以此實(shí)現(xiàn)所謂的多態(tài),如下代碼所示:
Base *b;
b = new Derived1;
b->f(); // 打印 "Derived1::f()"
b = new Derived2;
b->f(); // 打印 "Derived2::f()"
但,作為一名普通虛函數(shù) f( ),它實(shí)際上并不要求我們一定要復(fù)寫(即override)它,假如你在派生類中不復(fù)寫它,那么派生類將很自然地使用基類所提供的備用版本。
危險(xiǎn)就在于此,人類是一個(gè)有諸多毛病的物種,其中一個(gè)根深蒂固的毛病是自以為是和粗心大意,因此以下代碼很有可能出自某個(gè)同胞之手:
class Derived3 : public Base // 派生類3
{
// 注意:以下函數(shù)有參數(shù)
// 人類以為復(fù)寫了基類虛函數(shù),但實(shí)際并沒有
virtual void f(int){cout << "Derived3::f()" << endl;}
};
很明顯,這位同胞的本意與以上兩個(gè)派生類相同:派生出Derived3,并復(fù)寫虛函數(shù) f( )。很可惜,如果此時(shí)這位同胞貿(mào)然執(zhí)行如下代碼,將帶來災(zāi)難性的后果:
Base *b;
b = new Derived3;
b->f(); // 原想打印 "Derived2=3::f()"
// 實(shí)際卻打印"Base::f()"!
如果這不夠?yàn)?zāi)難,可以將函數(shù) f( ) 想象成民航飛機(jī)的起飛引導(dǎo)程序。
現(xiàn)在問題很明顯了:
派生類的虛函數(shù)的復(fù)寫,很有可能出現(xiàn)烏龍——人類自以為復(fù)寫了基類的虛函數(shù)(比如 void f( )) ,但實(shí)際上卻寫了另一個(gè)函數(shù)(比如 void f(int)) ,要命的是C++語法并不制止這種愚蠢的行為,它會(huì)以為這是我們出于某種神秘的原因才這么干的。
然后,執(zhí)行程序,就這。。
解決辦法:
消除人類與編譯器之間深刻的誤會(huì),即:我們在想復(fù)寫虛函數(shù)的時(shí)候,也同時(shí)將此想法明明白白地告訴編譯器,別讓它有什么誤會(huì)。怎么告訴它呢?蹬蹬噔噔憋了半天主角終于出場鳥:
class Derived3 : public Base // 派生類3
{
// 注意:
// 此處的 override 明明白白告訴編譯器:我要復(fù)寫虛函數(shù)
// 但由于基類沒有 void f(int),因此此處將報(bào)錯(cuò)!哦也!
virtual void f(int) override
{cout << "Derived3::f()" << endl;}
};
到此這篇關(guān)于C++中關(guān)鍵字 override 的簡析的文章就介紹到這了,更多相關(guān)C++中關(guān)鍵字 override 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt?關(guān)于容器的遍歷迭代器的使用問題小結(jié)
Qt是一個(gè)跨平臺(tái)的 C++ 開發(fā)庫,主要用來開發(fā)圖形用戶界面程序,當(dāng)然也可以開發(fā)不帶界面的命令行程序,本文重點(diǎn)給大家介紹Qt?關(guān)于容器的遍歷迭代器的使用問題小結(jié),感興趣的朋友一起看看吧2022-03-03
Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入與導(dǎo)出
QT中涉及到數(shù)據(jù)庫相關(guān)的項(xiàng)目,幾乎都需要將少量的信息數(shù)據(jù)導(dǎo)出到文件保存好,然后用戶可以打開該表格進(jìn)行編輯,編輯完成后保存,再重新導(dǎo)入到軟件中。所以本文將具體為大家介紹一下這一功能如何實(shí)現(xiàn),感興趣的可以跟隨小編一起試一試2022-01-01
OpenCV實(shí)現(xiàn)圖像角點(diǎn)檢測
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像角點(diǎn)檢測,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
C++實(shí)現(xiàn)LeetCode(146.近最少使用頁面置換緩存器)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(146.近最少使用頁面置換緩存器),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
你不知道的C++中namespace和using的用法實(shí)例
在C++語言編寫的程序中,變量和函數(shù)等的作用范圍是有一定限制的,下面這篇文章主要給大家介紹了一些你不知道的C++中namespace和using的用法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
C語言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++面向?qū)ο笾惡蛯ο竽切┠悴恢赖募?xì)節(jié)原理詳解
C++是面向?qū)ο缶幊痰?這也是C++與C語言的最大區(qū)別,下面這篇文章主要給大家介紹了關(guān)于C++面向?qū)ο笾惡蛯ο蟮募?xì)節(jié)原理的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

