在物件導向的開發過程中,經常出現類的繼承,這裡面出現的成員函式的過載(overload)、覆蓋(override)與隱藏(hidden)很容易混淆。
首先澄清這3個概念:
過載相同的範圍(在同乙個類中)
函式名字相同
引數不同
virtual 關鍵字可有可無
覆蓋(派生類函式覆蓋基類函式)
不同的範圍(分別位於派生類與基類)
函式名字相同
引數相同
基類函式必須有 virtual 關鍵字
隱藏(派生類的函式遮蔽了與其同名的基類函式)
如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載混淆)
如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)
下面用乙個簡單的例子來闡述
#include usingnamespace
std;
class
base
void g(float x)
void h(float x)
};
class derived : public
base
void g(int x)
void h(float x)
};
//intmain()
例子中,pb和pd指向同一位址,按理執行結果是相同的,但其實卻不是。由於隱藏機制的作用,部分方法的呼叫依賴於所使用的指標!
由此看來,隱藏機制似乎會帶來不少理解上的問題,但「存在即合理」:
寫語句pd->f(10)的人可能真的想呼叫derived::f(char *)函式,只是他誤將引數寫錯了。有了隱藏規則,編譯器就可以明確指出錯誤,這未必不是好事。否則,編譯器會靜悄悄地將錯就錯,程式設計師將很難發現這個錯誤,留下禍根
假如類derived有多個基類(多重繼承) ,有時搞不清楚哪些基類定義了函式f。如果沒有隱藏規則,那麼pd->f(10)可能會呼叫乙個出乎意料的基類函式f,而隱藏規則的存在消滅了這個問題
總結工欲善其事,必先利其器。弄清楚這些基本概念,才能在實踐中少走彎路。
p/3470287.html
c 過載 覆蓋及隱藏規則
成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有virtual關鍵字。令人迷惑的隱藏規則 本來僅僅區別...
型別相容規則與同名隱藏規則
型別相容規則 通過公有繼承,派生類得到了基類中除建構函式 析構函式之外的所有成員。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。乙個公有派生類的物件在使用上可以被當作基類的物件 通過基類物件名 指標只能使用從基類繼承的成員 include using nam...
不可不知的C 隱藏規則
在物件導向的開發過程中,經常出現類的繼承,這裡面出現的成員函式的過載 overload 覆蓋 override 與隱藏 hidden 很容易混淆。首先澄清這3個概念 過載 相同的範圍 在同乙個類中 函式名字相同 引數不同 virtual 關鍵字可有可無 覆蓋 派生類函式覆蓋基類函式 不同的範圍 分別...