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

2022-01-24 01:39:04 字數 818 閱讀 4828

名稱遮掩規則做的事就是:遮掩名稱。

情況一:

派生類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 ...