避免遮掩繼承而來的名稱

2021-04-13 00:29:19 字數 1090 閱讀 9005

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...