• 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
    ",f->f1);
    26     printf("f->f2 = %d
    ",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
    ",s.fn.f1);
    41     printf("s.fn.f2 = %d
    ",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 };
    复制代码

          修改后的运行效果:

    总结:      

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

  • 相关阅读:
    oracle按用户导出导入表
    一次简单的springboot+dubbo+flume+kafka+storm+redis系统
    数据库索引学习
    springboot-quartz 实现动态添加,修改,删除,暂停,恢复等功能
    springboot + rabbitmq 整合示例
    springboot-quartz普通任务与可传参任务
    eclipse里maven项目An error occurred while filtering resources解决办法
    job调度时间格式
    多线程发送短信和微信公众号推送消息
    SerializeUtil 序列化,反序列化工具类
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/11229086.html
Copyright © 2020-2023  润新知