1、過載(overload)
過載的定義為:在同一作用域中,同名函式的形式引數(引數個數、型別或者順序)不同時,構成函式過載。例如:
class a
;
以上的四個函式均構成過載。
需要注意的是:
函式返回值型別與構成過載無任何關係
類的靜態成員函式與普通成員函式可以形成過載
函式過載發生在同一作用域,如類成員函式之間的過載、全域性函式之間的過載
對於過載,最出名的應該就是運算子過載了吧。
2、隱藏(hiding)
隱藏定義:指不同作用域中定義的同名函式構成隱藏(不要求函式返回值和函式引數型別相同)。比如派生類成員函式隱藏與其同名的基類成員函式、類成員函式隱藏全域性外部函式。
例如:
void hidefunc(char* pstr)
class hidea
void usehidefunc()
};class hideb : public hidea
void usehidefunc()
};
隱藏的實質是;在函式查詢時,名字查詢先於型別檢查。如果派生類中成員和基類中的成員同名,就隱藏掉。編譯器首先在相應作用域中查詢函式,如果找到名字一樣的則停止查詢。
3、重寫/覆蓋(override)
重寫的定義:派生類中與基類同返回值型別、同名和同引數的虛函式重定義,構成虛函式覆蓋,也叫虛函式重寫。
需要注意的是,這裡有乙個特殊情況,即協變返回型別。
定義是:如果虛函式返回指標或者引用時(不包括value語義),子類中重寫的函式返回的指標或者引用是父類中被重寫函式所返回指標或引用的子型別。看示例**:
class base
;class c : b
;
使用override是希望能覆蓋基類中的虛函式,如果不符合則編譯器報錯。
我們還能把某個函式指點為final,意味著任何嘗試覆蓋該函式的操作都將引發錯誤:
class d : b
;class e : d
;
final 和 override 說明符出現在形參列表以及尾置返回型別之後。
final 還可以跟在類的後面,意思這個類不能當做其它類的基類。
5、總結
在討論相關概念的區別時,抓住定義才能區別開來。c++中函式過載、隱藏和覆蓋的區別並不難。
在這裡,牢記以下幾點,就可區分函式過載、函式隱藏、函式覆蓋和函式重寫的區別:
函式過載發生在相同作用域
函式隱藏發生在不同作用域
函式覆蓋就是函式重寫。準確地叫做虛函式覆蓋和虛函式重寫,也是函式隱藏的特例
關於三者的對比,如下表所示:
作用域virtual 修飾
函式名形參列表
返回值型別
過載相同無關
相同不同
無關隱藏
不同無關
相同無關
無關重寫(override)
不同有相同
相同相同(協變)
過載 重寫(覆蓋) 隱藏(重定義)
1 過載要求 函式名相同,引數不同 個數 型別 常函式也可以作為過載判斷。注意返回值不是過載的判斷標準。2 重寫 即覆蓋 要求 要求基類函式為虛函式,且基類函式和派生類函式名 引數等相同。3 隱藏 即重定義 要求 子類重新定義父類中有相同名稱的非虛函式 引數列表可以不同 4 重寫和隱藏都是發生在基類...
過載 重寫 隱藏
共同點 函式名相同 定義 1 如果在類裡函式名相同但是形參不同,則為過載。形參不同包括形參的型別個數以及順序。2 類間。重寫和隱藏都發生在基類和派生類之間。重寫 覆蓋 發生在派生類和基類之間。必須滿足兩個條件 1 基類有virtual宣告 2 函式名和形參必須完全相同。隱藏 發生在派生類和基類之間,...
c 過載,重寫 覆蓋,重定義 隱藏
關於c 的過載,重寫 又稱覆蓋 重定義 又稱隱藏 來做乙個小小的總結。過載最主要是指在同一作用域下的函式名相同,引數不同的函式過載,其強調同一作用域。同名同參,不同返回值不能作為過載,編譯器會提示函式重複定義。重寫和重定義主要在體現在繼承行為中,子類對父類函式的操作。重寫是虛函式的正確用法,指子類對...