C 繼承體系中的名稱覆蓋

2021-09-08 17:44:31 字數 1440 閱讀 9694

首先乙個簡單的樣例:

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 類深度 從根節點到該類最長的可能派生路徑中,所有經過類的數目,也就是說繼承的深度,有多少層的繼承...