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

2021-05-21 23:52:58 字數 317 閱讀 6667

問題**:

base class 中的所有名為 mf1 和 mf3 的函式被 derived class 中的名為 mf1 和 mf3 的函式覆蓋。從名字搜尋的觀點看,base::mf1 和 base::mf3 不再被 derived 繼承!就像你看到的,即使 base 和 derived classes 中的函式具有不同的引數型別,它也同樣適用,而且不管函式是 virtual 還是 non-virtual,它也同樣適用。

修改方案

1、繞過 c++ 對「通過繼承得到的名字」的預設的覆蓋機制

2、乙個簡單的 forwarding function**調函式)

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

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

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

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

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

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