我處於一個我需要獲得一些在C中工作的面向對象特性的位置,尤其是繼承。幸運的是,在堆棧溢出方面有一些很好的參考,特別是這個Semi-inheritance in C: How does this snippet work?和這個Object-orientation in C。該想法是包含基類的一個實例,在派生類中,並強制轉換它,像這樣:C類繼承通過類型打點,不包含?
struct base {
int x;
int y;
};
struct derived {
struct base super;
int z;
};
struct derived d;
d.super.x = 1;
d.super.y = 2;
d.z = 3;
struct base b = (struct base *)&d;
這是偉大的,但它變得深繼承樹繁瑣 - 我將有大約鏈5-6「類」,我真的不想一直鍵入derived.super.super.super.super.super.super.super。我希望的是,我可以強制轉換爲第n個元素的結構,像這樣:
struct base {
int x;
int y;
};
struct derived {
int x;
int y;
int z;
};
struct derived d;
d.x = 1;
d.y = 2;
d.z = 3;
struct base b = (struct base *)&d;
我上附帶的Visual Studio 2012和它的作品的C編譯器進行測試,但我有不知道C標準實際上是否能夠保證它。有沒有人可以肯定地知道這是否正確?我不想寫一堆代碼,只是發現它在這樣一個基本的層面上被打破了。
我想如果你注意了編譯器的struct packing規則(想想父類的邊界),你可以使它工作。但它看起來很脆弱,不夠優雅或便攜。並不容易維護。 –
看起來像這個問題的接受答案http://stackoverflow.com/a/3766251/2770712解釋得很好。 – Freddie
@Freddie,這是一個很好的鏈接。但與OP在談論深層次和可能不是統一類型的情況相比,這是一個非常簡單的案例。如果所有的字段都是指針或整數,那麼這不是問題,但只要你進入奇怪的打包和大小的結構,那麼將它們「組合」在一起將取決於編譯器的結構封裝。只是我2美分。 –