C语言结构体的“继承”
2015-11-28 16:21
267 查看
这里说的继承有点像C++里的父类和子类,实际上是结构体类型的强制转换,最近看Linux内核源码时经常接触到这种方法,在这里就当作是一个简单的学习吧。
下面给出一个Demo,很简单,分别定义了一个father结构体和一个son结构体,father结构体里定义了2个整形变量,son结构体里的第一个成员是father结构体类型的变量,son里的另外2个成员也是整形变量,这样,son结构体就好像继承了father结构体,并增加了2个成员,代码如下:
在这里,关键是把father类型的变量放在son结构体里的第一位。运行效果:
修改son结构体,使得father类型的变量不是放在son结构里的第一位,修改后如下:
修改后的运行效果:
总结:
这种方法对于结构体的扩展很有用。
下面给出一个Demo,很简单,分别定义了一个father结构体和一个son结构体,father结构体里定义了2个整形变量,son结构体里的第一个成员是father结构体类型的变量,son里的另外2个成员也是整形变量,这样,son结构体就好像继承了father结构体,并增加了2个成员,代码如下:
#include <stdio.h> //父结构体 struct father { int f1; int f2; }; //子结构体 struct son { //子结构体里定义一个父结构体变量,必须放在子结构体里的第一位 struct father fn; //子结构体的扩展变量 int s1; int s2; }; void test(struct son *t) { //将子结构体指针强制转换成父结构体指针 struct father *f = (struct father *)t; //打印原始值 printf("f->f1 = %d\n",f->f1); printf("f->f2 = %d\n",f->f2); //修改原始值 f->f1 = 30; f->f2 = 40; } int main(void) { struct son s; s.fn.f1 = 10; s.fn.f2 = 20; test(&s); //打印修改后的值 printf("s.fn.f1 = %d\n",s.fn.f1); printf("s.fn.f2 = %d\n",s.fn.f2); return 0; }
在这里,关键是把father类型的变量放在son结构体里的第一位。运行效果:
修改son结构体,使得father类型的变量不是放在son结构里的第一位,修改后如下:
//子结构体 struct son { //子结构体的扩展变量 int s1; int s2; struct father fn; };
修改后的运行效果:
总结:
这种方法对于结构体的扩展很有用。
相关文章推荐
- C++拷贝构造函数
- C++设计模式——从多态到观察者模式到MVC架构
- C/C++之回调函数
- c++中exit的使用
- 解决报错libc++abi.dylib: terminate_handler unexpectedly threw an exception
- C++primer plus第六版课后编程练习答案8.7
- C++primer plus第六版课后编程练习答案8.6
- C++变量及初始化的总结
- C++primer plus第六版课后编程练习答案8.5
- C++primer plus第六版课后编程练习答案8.4
- C++primer plus第六版课后编程练习答案8.3
- C++中static关键字的使用总结
- C++primer plus第六版课后编程练习答案8.2
- C++primer plus第六版课后编程练习答案8.1
- C语言字节对齐详解
- 一起talk C栗子吧(第六十五回:C语言实例--DIY字符串连接函数)
- C语言基础总结
- C语言中的特殊符号
- 【C++】前序线索化二叉树及其遍历
- C语言求最大公约数最小公倍数