這里說的繼承有點像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 };
修改后的運行效果:
總結:
這種方法對於結構體的擴展很有用。