北京微網(wǎng)站建設(shè)seo優(yōu)化系統(tǒng)
C++11中的override和final關(guān)鍵字是為了增強(qiáng)代碼的編譯時(shí)類型檢查和面向?qū)ο笤O(shè)計(jì)中的繼承機(jī)制。
override關(guān)鍵字用于顯示地表明派生類中的成員函數(shù)覆蓋了基類中的虛函數(shù)。當(dāng)派生類中的函數(shù)與基類中的虛函數(shù)簽名不同或者沒(méi)有使用override關(guān)鍵字時(shí),編譯器會(huì)給出警告或錯(cuò)誤提示。這樣可以避免因?yàn)楹瘮?shù)簽名不同而無(wú)法正確覆蓋基類中的虛函數(shù),從而導(dǎo)致程序運(yùn)行時(shí)的錯(cuò)誤。
final關(guān)鍵字用于顯示地防止在派生類中重載某個(gè)函數(shù)。如果在一個(gè)虛函數(shù)上使用了final關(guān)鍵字,那么任何派生類都無(wú)法再對(duì)該函數(shù)進(jìn)行重載。
當(dāng) final 用于類上時(shí),它表示該類是最終類,不能被派生出子類。
class Base final { ... };
當(dāng) final 用于成員函數(shù)上時(shí),它表示該函數(shù)不能被重寫(xiě)
class Base {
public:virtual void foo() final;
};class Derived : public Base {
public:// 以下代碼會(huì)報(bào)錯(cuò)virtual void foo() override;
};
當(dāng) final 用于虛函數(shù)上時(shí),它表示該虛函數(shù)不能被覆蓋
class Base {
public:virtual void foo();
};class Derived : public Base {
public:// 以下代碼會(huì)報(bào)錯(cuò)virtual void foo() final;
};
其他:
基類中將虛函數(shù)聲明為私有函數(shù) 和 將虛函數(shù)聲明為 final 的效果是不同的。
將虛函數(shù)聲明為私有函數(shù),可以讓子類無(wú)法直接調(diào)用該函數(shù),但子類仍然可以定義一個(gè)同名的函數(shù)來(lái)實(shí)現(xiàn)其自己的功能。這種情況下,虛函數(shù)的目的是為了供子類重寫(xiě),但是基類本身并不想讓子類直接使用虛函數(shù)的實(shí)現(xiàn)。
而將虛函數(shù)聲明為 final,則是為了明確告訴子類,該函數(shù)不允許被重寫(xiě)。這是因?yàn)榛愐呀?jīng)認(rèn)為該函數(shù)已經(jīng)具備了足夠的功能,不需要子類重新實(shí)現(xiàn)。同時(shí),final 也可以起到一定的優(yōu)化作用,因?yàn)榫幾g器可以在編譯時(shí)確定該函數(shù)的調(diào)用路徑,從而提高程序的效率。
此外,將虛函數(shù)聲明為私有函數(shù)并不能完全防止子類重寫(xiě)該函數(shù)。子類可以通過(guò)其他方式(如友元函數(shù)、內(nèi)聯(lián)函數(shù)等)來(lái)訪問(wèn)該函數(shù),并在其內(nèi)部實(shí)現(xiàn)同名函數(shù)來(lái)達(dá)到重寫(xiě)的目的。而將虛函數(shù)聲明為 final,可以確保子類無(wú)法重寫(xiě)該函數(shù),從而保證程序的正確性和安全性。
因此,盡管將虛函數(shù)聲明為私有函數(shù)可以達(dá)到一定的效果,但是如果真正想防止子類重寫(xiě)該函數(shù),還是應(yīng)該使用 final 關(guān)鍵字。