2014-02-24 42 views
2

爲什麼這有效?在C中使用指向父級的父指針訪問子類成員

typedef struct { 
    data member_x; 
} base; 

typedef struct { 
    struct base; 
    data member_y; 
} derived; 

void function_on_base(struct base * a); //這裏我可以兩個指針傳遞給導出和基礎,我怎麼能這樣做?

怎樣才能得到需要時基指針的函數function_on_base來接受類型的指針派生?

+0

這裏有問題嗎? –

+0

爲什麼/它是如何工作的? :) – Kam

回答

2

它的工作原理,因爲在記憶中,derived結構可以表示爲這樣:

   sizeof(derived) 
    sizeof(base) 
|-------------------|----------------| 

beginning   end of base  end of derived 
of derived 
AND of base 

所以這樣的:

derived my_derived; 
(base)my_derived; 

會採取實際的derivedsizeof(base)第一字節,這相當於base struct(因爲您在derived結構中聲明瞭它的第一個位置)。

當你打電話給你的功能時,隱式轉換是在你不知情的情況下完成的,而且很簡單。您應該編譯一些額外的標誌以避免這些隱式轉換。

儘管此功能主要用於C語言,因爲它允許「複製」OOP功能,這些功能以C++等語言存在。