C 中定義派生類之前需要看到基類的定義實體

2021-04-23 17:52:55 字數 1132 閱讀 1361

在c++中定義乙個從基類base派生出來的類derv,需要在定義base之前確保編譯器能夠看到base的定義實體,

即...    //base的類定義要出現在此處

class b: public base ;

如果僅僅是在定義derv之前宣告一下base,如下所示:

class base;

class derv : public base ;

編譯器會報出如下的錯誤資訊

derv.h:2: error: invalid use of incomplete type 『struct base』

derv.h:1: error: forward declaration of 『struct base』

為什麼c++語言要加上這個限制呢?

我思考了一下,覺得可以用這個理由來解釋:在程式中使用派生類的時候,比如,建立乙個派生類物件,訪問乙個

派生類物件的方法,都會需要訪問基類的內容。因為派生類就是在基類的基礎上擴充套件形成的乙個類。在記憶體布局

中,可以看到派生類實際上就是在基類上追加了一些字段。

設想一下,有如下的類定義:

base.h:

class base

}derv.h:

class derv : public base

};main.cc:

#include "derv.h"

int main()

在new語句中試圖分配乙個derv物件的時候,需要看到基類base的定義資訊,然後才能在base的基礎上新增

derv中定義的內容,構成乙個新的物件。

理論上說,c++編譯器可以作得足夠聰明,對程式中用到derv的地方(建立derv物件,呼叫derv方法,訪問derv

的資料成員)插乙個樁,並不為其生成實際的code,等到將所有c++原始檔編譯完以後,再用獲得的base類的信

息進行解樁,以解決上面的問題,但這會給編譯器的設計人員帶來額外的負擔,而且會影響編譯器的執行效率。我

想c++的設計人員也是基於這樣的考慮才沒有提供這樣的特性支援的吧。

定義基類和派生類

作為繼承關係中根節點的類通常都會定義乙個虛析構函式。基類通常都應該定義乙個虛析構函式,即使該函式不執行任何實際操作也是如此。成員函式與繼承 在c 語言中,基類必須將它的兩種成員函式區分開來 一種是基類希望其派生類進行覆蓋的函式 另一種是基類希望派生類直接繼承而不要改變的函式。對於前者,基類通常將其定...

定義基類和派生類

定義基類 對於基類,我們需要記住的是作為繼承關係中根節點的類通常都會定義乙個虛析構函式。基類通常都會定義乙個虛析構函式,即使該函式不執行任何實際操作也是如此。成員函式和繼承 派生類可以繼承其基類的成員,也可以對基類中的虛函式進行重新定義。換句話說,派生類需要對這些操作提供自己的新定義以覆蓋 over...

定義基類和派生類

物件導向程式設計的核心思想是資料抽象 繼承和動態繫結。通過繼承聯絡在一起的類構成一種層次關係,通常在層次關係的根部有乙個基類,其他類則直接或間接的從基類繼承而來,這些繼承得到的類稱為派生類。基類負責定義在層次關係中所有類共同擁有的成員,而每個派生類定義各自特有的成員。派生類必須通過使用類派生列表明確...