zoukankan      html  css  js  c++  java
  • 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 };
    复制代码

          修改后的运行效果:

    总结:      

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

  • 相关阅读:
    在TreeView控件节点中显示图片
    PAT 甲级 1146 Topological Order (25 分)
    PAT 甲级 1146 Topological Order (25 分)
    PAT 甲级 1145 Hashing
    PAT 甲级 1145 Hashing
    PAT 甲级 1144 The Missing Number (20 分)
    PAT 甲级 1144 The Missing Number (20 分)
    PAT 甲级 1151 LCA in a Binary Tree (30 分)
    PAT 甲级 1151 LCA in a Binary Tree (30 分)
    PAT 甲级 1149 Dangerous Goods Packaging
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/11229086.html
Copyright © 2011-2022 走看看