在程式中有作用域的概念,當編譯器處在某個函式的作用域時,當需要需要查詢某個變數或者某個函式時,總是從最裡面的作用域開始查詢,當查詢不到時,才向外圍繼續查詢,其中尤為需要注意的是:c++中的名稱遮掩規則所做的唯一的事情就是:遮掩名稱
,而不管型別是否相同。例如:
class base;
class derived:public base;
/*因為在同一作用域中函式名相同,但引數個數不同的函式為過載,但是,不同作用中,如果名字相同就會發生覆蓋,覆蓋的情況,只看名字,不關心型別,引數個數等,例如*/
derived d;
d.mf1(int) //報錯,因為在derived的作用中可以找到名為mf1的函式,但是該函式並沒有引數,因此會報錯。
這樣做的原因主要是為了防止新建derived class時,附帶的從疏遠的base class類繼承過載函式。
但是可以使用using申明來達到部分覆蓋的效果。
class derived:public base;
summary
derived classes內的名稱會遮掩base classes內的名稱
為了讓遮掩的名稱重見天日,可以使用using宣告。
避免遮掩繼承而來的名稱
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 de...
避免遮掩繼承而來的名稱
我們知道,當位於乙個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 中...