這里說的繼承有點像C++里的父類和子類,實際上是結構體類型的強制轉換,最近看Linux內核源碼時經常接觸到這種方法,在這里就當作是一個簡單的學習吧。
下面給出一個Demo,很簡單,分別定義了一個father結構體和一個son結構體,father結構體里定義了2個整形變量,son結構體里的第一個成員是father結構體類型的變量,son里的另外2個成員也是整形變量,這樣,son結構體就好像繼承了father結構體,並增加了2個成員,代碼如下:
1 #include <stdio.h>
2
3 //父結構體
4 struct father
5 {
6 int f1;
7 int f2;
8 };
9
10 //子結構體
11 struct son
12 {
13 //子結構體里定義一個父結構體變量,必須放在子結構體里的第一位
14 struct father fn;
15 //子結構體的擴展變量
16 int s1;
17 int s2;
18 };
19
20 void test(struct son *t)
21 {
22 //將子結構體指針強制轉換成父結構體指針
23 struct father *f = (struct father *)t;
24 //打印原始值
25 printf("f->f1 = %d\n",f->f1);
26 printf("f->f2 = %d\n",f->f2);
27 //修改原始值
28 f->f1 = 30;
29 f->f2 = 40;
30 }
31
32 int main(void)
33 {
34 struct son s;
35 s.fn.f1 = 10;
36 s.fn.f2 = 20;
37
38 test(&s);
39 //打印修改后的值
40 printf("s.fn.f1 = %d\n",s.fn.f1);
41 printf("s.fn.f2 = %d\n",s.fn.f2);
42
43 return 0;
44 }
在這里,關鍵是把father類型的變量放在son結構體里的第一位。運行效果:

修改son結構體,使得father類型的變量不是放在son結構里的第一位,修改后如下:
1 //子結構體
2 struct son
3 {
4 //子結構體的擴展變量
5 int s1;
6 int s2;
7 struct father fn;
8 };
修改后的運行效果:

總結:
這種方法對於結構體的擴展很有用。

