C 隱藏規則

2021-09-08 11:47:21 字數 1155 閱讀 3902

在物件導向的開發過程中,經常出現類的繼承,這裡面出現的成員函式的過載(overload)、覆蓋(override)與隱藏(hidden)很容易混淆。

首先澄清這3個概念:

過載相同的範圍(在同乙個類中)

函式名字相同

引數不同

virtual 關鍵字可有可無

覆蓋(派生類函式覆蓋基類函式)

不同的範圍(分別位於派生類與基類)

函式名字相同

引數相同

基類函式必須有 virtual 關鍵字

隱藏(派生類的函式遮蔽了與其同名的基類函式)

如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載混淆)

如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)

下面用乙個簡單的例子來闡述

#include using

namespace

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 關鍵字可有可無 覆蓋 派生類函式覆蓋基類函式 不同的範圍 分別...