public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
class derived: public base ;
derived d;
int x;
d.mf1(); // fine, calls derived::mf1
d.mf1(x); // error! derived::mf1 hides base::mf1
d.mf2(); // fine, calls base::mf2
d.mf3(); // fine, calls derived::mf3
d.mf3(x); // error! derived::mf3 hides base::mf3
不管是不是virtual,也不管函式引數是否不同,父類的函式名稱都被掩蓋了
解決辦法:
class derived: public base ;
derived d;
int x;
...d.mf1(); // still fine, still calls derived::mf1
d.mf1(x); // now okay, calls base::mf1
d.mf2(); // still fine, still calls base::mf2
d.mf3(); // fine, calls derived::mf3
d.mf3(x); // now okay, calls base::mf3
如果你繼承base class並加上過載函式,而你又希望重定義或覆寫其中一部分,那麼你必須為那些原本會被遮掩的每個名稱引入乙個using宣告,否則某些你希望繼承的名稱會被遮掩
避免遮掩繼承而來的名稱
我們知道,當位於乙個derived class成員函式內指涉 refer to base class內的某物 也許是個成員函式 typedef 或是成員變數 時,編譯器可以找出我們所指的東西,因為derived class繼承了宣告與base class內的所有東西。但是讓我們看下面一段 inclu...
條款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...