首先乙個簡單的樣例:
int x;
int f()
在上述**中。函式f的區域性變數x掩蓋了全域性變數x。這得從 「c++的名字查詢機制「說起,首先。在函式f的區域性作用域中查詢。(甚至是語句塊)。假設不存在,到上一層的作用域再進行查詢,... 該命名空間中查詢,最後是全域性作用域。
在類的繼承體系中,名字覆蓋問題也是非常困擾的。此處的"名字"但是是函式名,變數名,typedef, enum都能夠,此處以函式名為例。
值得注意的是,derived的作用域是巢狀在base作用域中的。
對於以下的**:
class base
void func2()
virtual void func3() = 0;
};class derived : public base
void func2(int x)
void func3()
void func3(int )
};int main()
base基類中定義了函式func1 與 func2,在派生類中重寫了函式func1,並定義了該函式的過載版本號。
對於main函式內的呼叫,見凝視解析。
編譯器在面對函式呼叫時,首先是在作用域範圍內查詢該函式名(由內之外)。 假設找到了該函式名之後。編譯器便停止查詢,開始檢查形參與實參的匹配是否合法, 假設不合法,不能通過編譯。
假設要在上述**中呼叫 基類中的版本號 func1(int),那麼就須要讓編譯器在看到該函式呼叫時,第一時間看到base中的該函式名字,因此。using宣告攻克了這個難題,在derived類定義體內部使用using base::func1宣告,也就是讓base中的func1函式名字在 」編譯器查詢derived「作用域是可見 。
using的位置放在**???。!!
非常easy的道理,public繼承 意味 」 is a 「的關係,那麼在base class中的 public的名稱在derived中也應該是public。
可是,假設你並不想繼承 base中的全部的函式,僅僅想繼承一部分,那麼 這就無關於函式名字的問題了。 既然如此。public繼承就不應該被使用!
因此,我會告訴你。使用private繼承也許有這種福利。
如果derived以private形式繼承base。而derived中僅僅想要繼承base中的某個特定的函式版本號,那麼using已經無論用了,你須要的是其它的技術。
比如以下的簡單樣例:
class base
};class derived : public base
};
最後。在c++的名字查詢中。為了避免base的函式名覆蓋,使用using 宣告或者轉交函式來完畢。
C 繼承中的同名覆蓋
1,父子間的衝突是由繼承帶來的,兩個類之間存在了繼承的關係,必然的會帶來一 些問題,本文要討論的是父子之間成員變數或成員函式的命名問題 2,思考 1,子類中是否可以定義父類中的同名成員?1,可以,本文先程式設計解決這個問題 2,這個問題就是同名覆蓋問題 2,如果可以,如何區分?如果不可以,為什麼?3...
c 繼承中的覆蓋,隱藏,虛擬繼承
首先,宣告一點,覆蓋和隱藏是基於繼承來討論的 至於過載貌似和繼承沒有太大聯絡,所謂過載就是同一函式名,不同的引數列表 型別或個數 這裡不做討論。1 覆蓋 特點 1 父類的成員函式是虛函式,即在成員函式前加上virtual關鍵字 2 子類的同名成員函式和父類的完全相同,即引數和返回值型別完全一樣 滿足...
C 繼承體系
乙個繼承體系的根數目,深度和扇出數是否合適,要取決於這個體系要模擬的領域和這個領域所需要的特性,繼承體系就好比乙個有向圖。1 根節點 某個類如果沒有基類,既不是任何類的子類,那麼在有向圖中就是根節點。2 類深度 從根節點到該類最長的可能派生路徑中,所有經過類的數目,也就是說繼承的深度,有多少層的繼承...