條款 33 避免繼承而來的名稱

2021-07-05 09:13:31 字數 591 閱讀 8316

/*避免繼承而來的名稱*/

//一朵玫瑰叫任何名字還是一樣芬芳-----莎士比亞

//子類中查詢乙個成員的的名字的方法 1子類作用域 2 基類作用域

//3 內含基類的名字空間 4 全域性

#includeclass base

void mf3(double)

//..

};class derived :public base

void mf3()

//從名稱查詢觀點看,基類的mf1,mf3不再被子類繼承

//即使基類與子類內的函式有不同的引數型別也適用,而且不論函式是虛還是非虛

//其背後的基本理由是防止你在程式中建立新的子類時附帶從疏遠的基類繼承過載函式,而如果你使用公有繼承而又不繼承那些過載函式,就是違反is_a關係

void mf4()

//..

};//如果子類只想繼承無參版本,如果是公有繼承這種情況不會發生

class a ;

class b :private a

};using namespace std;

int main()

條款33 避免遮掩繼承而來的名稱

問題 base class 中的所有名為 mf1 和 mf3 的函式被 derived class 中的名為 mf1 和 mf3 的函式覆蓋。從名字搜尋的觀點看,base mf1 和 base mf3 不再被 derived 繼承!就像你看到的,即使 base 和 derived classes 中...

條款33 避免遮掩繼承而來的名稱

結論1 derived classes內的名稱會遮掩base classes內的名稱。在public繼承下從來沒有人希望如此。c 的名稱遮掩規則所做的唯一事情就是 遮掩名稱,至於名稱是否應為相同或不同的型別,並不重要。public繼承暗示base class 和 derived class之間是is...

條款33 避免遮掩繼承而來的名稱

名稱遮掩規則做的事就是 遮掩名稱。情況一 派生類mf1 覆蓋基類mf1 此時基類中並沒有過載的mf1 函式。在這樣的情況下,一切運作正常。情況二 基類中,mf1 和mf3 有過載的版本,此時在派生類中修改mf1 mf3 時,修改的那本版本的函式正常運作,沒被修改的版本的成員函式被遮蓋。此時,實際上就...