名稱遮掩規則做的事就是:遮掩名稱。
情況一:
派生類mf1() 覆蓋基類mf1(),此時基類中並沒有過載的mf1()函式。在這樣的情況下,一切運作正常。
情況二:
基類中,mf1()和mf3()有過載的版本,此時在派生類中修改mf1()、mf3()時,修改的那本版本的函式正常運作,沒被修改的版本的成員函式被遮蓋。此時,實際上就違背了public繼承的is-a關係。因此應該避免這種情況。
方案一:
方案二:
如果編譯器不支援using宣告,public繼承的名稱遮掩問題也可以用轉交函式實現。
即:為每乙個基類版本寫轉交函式。
使用轉交函式實現部分繼承:
class
base
;class
derived
:private base };
derived d;
int x;
d.mf1()
;//呼叫的是derived::mf1
d.mf1
(x);
//錯誤,base::mf1()被遮掩了
在這裡轉交函式做到了兩點:
這便實現了只繼承基類的一部分。
條款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 避免繼承而來的名稱
避免繼承而來的名稱 一朵玫瑰叫任何名字還是一樣芬芳 莎士比亞 子類中查詢乙個成員的的名字的方法 1子類作用域 2 基類作用域 3 內含基類的名字空間 4 全域性 includeclass base void mf3 double class derived public base void mf3 ...