国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++11 override and final

2019-11-11 07:53:17
字體:
供稿:網(wǎng)友

from : https://www.devbean.net/2012/05/cpp11-override-final/

2012 年 3 月 22 日,GCC 4.7.0 正式發(fā)布。從這個版本開始,GCC 增加了許多新的 C++ 11 的特性。今天我們要介紹的是其中的一個特性:顯式的使用 final和override關(guān)鍵字。先來看下面的例子:

struct B1 final { };struct D1 : B1 { }; // 錯誤!不能從 final 類繼承!

上面的代碼是錯誤的,因為 D1 試圖繼承 B1,而 B1 則聲明為 final。當(dāng)然!還有另外的用法:

struct B2{ virtual void f() final {} // final 函數(shù)};struct D2 : B2{ virtual void f() {}};

這段代碼又會出錯,因為D2::f重寫了B2::f,但是B2::f卻被聲明為 final 的!

下面再看另外一段代碼:

struct B3{ virtual void f() {}};struct D3 : B3{ void f() {}};

開發(fā) D3 的程序員真的想重寫B(tài)3::f函數(shù)嗎?還是說,他只是不小心寫了個與父類同名的函數(shù),卻在不經(jīng)意間導(dǎo)致了覆蓋?為了避免這種錯誤,C++ 11 引入了override關(guān)鍵字(多么像 C# 啊!)。于是,我們會發(fā)現(xiàn),下面的一段代碼是會出錯的:

struct B4{ virtual void g(int) {}};struct D4 : B4{ virtual void g(int) override {} // OK virtual void g(double) override {} // Error};

多虧了override關(guān)鍵字,我們可以讓編譯器幫我們檢測到這個很難發(fā)現(xiàn)的程序錯誤。這段代碼的錯誤在于,override關(guān)鍵字表明,g(double)雖然想要進(jìn)行override的操作,但實際父類并沒有這么個函數(shù)。

值得注意的是,這些并不是一些語法糖,而是能確確實實地避免很多程序錯誤,并且暗示編譯器可以作出一些優(yōu)化。調(diào)用標(biāo)記了final的virtual函數(shù),例如上面的B2::f,GNU C++ 前端會識別出,這個函數(shù)不能被覆蓋,因此會將其從類的虛表中刪除。而標(biāo)記為final的類,例如上面的 B1,編譯器則根本不會生成虛表。這樣的代碼顯然更有效率。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 曲周县| 乌兰浩特市| 高邮市| 津市市| 拜泉县| 孟连| 宜丰县| 兴海县| 灌云县| 西安市| 唐海县| 五寨县| 淳安县| 延寿县| 绥芬河市| 泗水县| 电白县| 巴中市| 余江县| 乐清市| 兴文县| 新余市| 昌平区| 彭泽县| 平乐县| 阿坝| 柳江县| 拜泉县| 潢川县| 印江| 孝感市| 玛多县| 陆丰市| 资兴市| 禹城市| 修武县| 祁连县| 永丰县| 永丰县| 远安县| 岳西县|