C語言結構體的“繼承”


        這里說的繼承有點像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 };

      修改后的運行效果:

總結:      

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM