final/override控制
生活随笔
收集整理的這篇文章主要介紹了
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控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本域字数限制统计(不区分中英文 符号)
- 下一篇: 数对之差的最大值