您的位置:首页 > 编程语言 > C语言/C++

C语言结构体的“继承”

2015-11-28 16:21 267 查看
这里说的继承有点像C++里的父类和子类,实际上是结构体类型的强制转换,最近看Linux内核源码时经常接触到这种方法,在这里就当作是一个简单的学习吧。

下面给出一个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;
};


修改后的运行效果:



总结:

这种方法对于结构体的扩展很有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: