編程就好比是程式設計師手裡的武器,今天編程小達人就來教你,快速學會final/override控制,馬上跟隨小編來學習一下吧。
在了解C++11中的final/override關鍵字之前,我們先了解一下C++關於重載的概念。簡單地說,一個類A中聲明的虛函數fun在其派生類B中再次被定義,且B中的函數fun跟A中fun的原型一樣(函數名、參數列表等一樣),那麼我們就稱B重載(overload)了A的fun函數。
對於任何B類型的變量,調用成員函數fun都是調用了B重載的版本。而如果同時有A的派生類C,卻並沒有重載A的fun函數,那麼調用成員函數fun則會調用A中的版本。這在C++中就實現多態。
在通常情況下,一旦在基類A中的成員函數fun被聲明為virtual的,那麼對於其派生類B而言,fun總是能夠被重載的(除非被重寫了)。
有的時候我們並不想fun在B類型派生類中被重載,那麼,C++98沒有方法對此進行限制。我們看看下面這個具體的例子,如下面的代碼清單所示。
#include <iostream>
using namespace std;
class MathObject{
public:
virtual double Arith()=0;
virtual void Print()=0;
};
class Printable:public MathObject{
public:
double Arith()=0;
void Print()//在C++98中我們無法阻止該接口被重寫
{
cout<<"Output is:"<<Arith()<<endl;
}
};
class Add2:public Printable{
public:
Add2(double a,double b):x(a),y(b){}
double Arith(){return x+y;}
private:
double x,y;
};
class Mul3:public Printable{
public:
Mul3(double a,double b,double c):x(a),y(b),z(c){}
double Arith(){return x*y*z;}
private:
double x,y,z;
};
//編譯選項:g++2-10-1.cpp
在上面的代碼清單中,我們的基礎類MathObject定義了兩個接口:Arith和Print。類Printable則繼承於MathObject並實現了Print接口。
接下來,Add2和Mul3為了使用MathObject的接口和Printable的Print的實現,於是都繼承了Printable。這樣的類派生結構,在面向對象的編程中非常典型。
不過倘若這裡的Printable和Add2是由兩個程式設計師完成的,Printable的編寫者不禁會有一些憂慮,如果Add2的編寫者重載了Print函數,那麼他所期望的統一風格的列印方式將不復存在。
對於Java這種所有類型派生於單一元類型(Object)的語言來說,這種問題早就出現了。因此Java語言使用了final關鍵字來阻止函數繼續重寫。final關鍵字的作用是使派生類不可覆蓋它所修飾的虛函數。
其實就這麼多東西。你用過的任何程序,不管多麼複雜,都是由上面這些基本功能組合而成的。所以我們也可以說,編程是將複雜的任務逐步分解為越來越小的子任務,直到問題解決,看完你學會了嗎?