C语言结构体的“继承”

Posted qiumingcheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ;
技术图片

      修改后的运行效果:

技术图片

总结:      

      这种方法对于结构体的扩展很有用。

以上是关于C语言结构体的“继承”的主要内容,如果未能解决你的问题,请参考以下文章

Go语言学习——结构体的匿名字段嵌套结构体结构体的“继承”

链表使用类和结构体的区别?

golang中级进阶(二):结构体

C语言中结构体的理解

c语言自定义类型——结构体,位段(匿名结构体,结构体的自引用,结构体的内存对齐)

c语言结构体的问题,存储空间大小?