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

2021-06-22 11:28:56 字數 402 閱讀 3595

結論1:derived classes內的名稱會遮掩base classes內的名稱。在public繼承下從來沒有人希望如此。

c++的名稱遮掩規則所做的唯一事情就是:遮掩名稱,至於名稱是否應為相同或不同的型別,並不重要。

public繼承暗示base class 和 derived class之間是is-a的關係,所以public繼承是希望繼承base class的所有函式。

結論2:為了讓被遮掩的名稱再見天日,可使用using 宣告式或轉交函式(即在derived class的同名函式內呼叫基類同名函式)。

using 宣告式會令繼承而來的某給定名稱之所有同名函式在derived class中可見,適合於public繼承的情況。轉換函式適用於不想繼承base classes的所有函式的情況,在private繼承下有意義。

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

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

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

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

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

避免繼承而來的名稱 一朵玫瑰叫任何名字還是一樣芬芳 莎士比亞 子類中查詢乙個成員的的名字的方法 1子類作用域 2 基類作用域 3 內含基類的名字空間 4 全域性 includeclass base void mf3 double class derived public base void mf3 ...