日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

final/override控制

發布時間:2024/9/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 final/override控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先來復習下C++虛函數的特性:①重載函數需要與父類中虛函數的簽名相同;②子類中的重載函數是否有virtual標識不影響繼承樹。按照這些特性,有如下代碼

1 #include <iostream> 2 using namespace std; 3 4 class MethObject { 5 6 public: 7 virtual double Arith()=0; 8 virtual void Print()=0; 9 }; 10 11 class Printable:public MethObject { 12 13 public: 14 double Arith()=0; 15 void Print(){ 16 cout << "Output is: " << Arith() << endl; 17 } 18 }; 19 20 class Add2:public Printable { 21 22 public: 23 Add2(double a, double b):x(a), y(b) {} 24 double Arith() {return x+y;} 25 26 private: 27 double x, y; 28 }; 29 30 class Mul3:public Printable { 31 32 public: 33 Mul3(double a, double b, double c):x(a), y(b), z(c) {} 34 double Arith() {return x*y*z;} 35 36 private: 37 double x, y, z; 38 };

現在我們為了保持統一的打印風格,從而禁止Printable的子類重載Print虛函數,這就要用到C++11中的final關鍵字,做過Java的都知道finally關鍵字,他們的特性類似。

稍微修改下代碼,就可以看到編譯錯誤:

1 #include <iostream> 2 using namespace std; 3 4 class MethObject { 5 6 public: 7 virtual double Arith()=0; 8 virtual void Print()=0; 9 }; 10 11 class Printable:public MethObject { 12 13 public: 14 double Arith()=0; 15 void Print() final{ 16 cout << "Output is: " << Arith() << endl; 17 } 18 }; 19 20 class Add2:public Printable { 21 22 public: 23 Add2(double a, double b):x(a), y(b) {} 24 double Arith() {return x+y;} 25 void Print() { 26 cout << "This is disallowed!" << endl; 27 } 28 29 private: 30 double x, y; 31 }; 32 33 class Mul3:public Printable { 34 35 public: 36 Mul3(double a, double b, double c):x(a), y(b), z(c) {} 37 double Arith() {return x*y*z;} 38 39 private: 40 double x, y, z; 41 };

編譯結果如下:

從編譯器提示的信息,就可以很清楚的看到錯誤內容。

C++虛函數的第二個特性,會導致一個“跨層”的問題,看如下代碼:

1 class A { 2 virtual void Test() = 0; 3 }; 4 5 class B:public A { 6 }; 7 8 class C:public B { 9 void Test(){} 10 };

類C中的Test函數仍然是虛函數,但是類C的繼承者卻不一定知道Test函數是否可以重載,或者還有一種情況,類C的繼承者原意是想重載Test函數,但是手抖了下,寫成了test(),在編譯器看來這是OK的,會產生Test()與test()兩個函數,但是在實際運用中,就會出現一些不必要的錯誤。為了解決這個問題,就需要用到override關鍵字(類似Java的修飾符中的@override)

1 #include <iostream> 2 using namespace std; 3 4 class A { 5 virtual void Test() = 0; 6 void test(); 7 }; 8 9 class B:public A { 10 }; 11 12 class C:public B { 13 void Test() override {} 14 void test() override {} 15 };

編譯結果如下:

提示信息很清晰,一眼就能看懂,就不做過多解釋了。

?

轉載于:https://www.cnblogs.com/lniwn/p/3403707.html

總結

以上是生活随笔為你收集整理的final/override控制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。