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\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 };

          修改后的运行效果:

    总结:      

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

  • 相关阅读:
    非foreach情况下取某一节点的position()
    MorningSale 介绍
    XSLT中的内容自动换列
    十年相伴一首歌
    Navicat的强大自动定时备份
    Xshell6评估期已过的解决方法
    Ext JS继承: 关于object, constructor和prototype
    WCF+Silverlight 异常处理
    Adding/removing fields and columns drag & drop bug's fix
    WCF部署至IIS问题二则
  • 原文地址:https://www.cnblogs.com/lknlfy/p/2848348.html
Copyright © 2011-2022 走看看