结构体继承小知识点

Alice Yu Lv3

C中结构体的继承

  • 起因是一段代码,我没看懂,简化一下是这样:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <stdio.h>

    struct Base {
    int x;
    int y;
    };

    struct Derived {
    struct Base base;
    int z;
    };

    int main() {
    struct Derived d;
    struct Base* b = (struct Base*)&d;

    // 通过 b 访问 Base 的成员
    b->x = 1;
    b->y = 2;

    // 通过 d 访问 Derived 的成员
    d.z = 3;

    // 输出结果
    printf("b->x = %d, b->y = %d\n", b->x, b->y); // 输出: b->x = 1, b->y = 2
    printf("d.z = %d\n", d.z); // 输出: d.z = 3

    // 尝试通过 b 访问 z(错误)
    // b->z = 4; // 这行代码会导致编译错误

    return 0;
    }
  • 实际上,base是derived的基类,derived相较之base多出了一个z属性。
  • 之所以把base作为derived的第一个变量,就是因为结构体中,第一个变量的地址和整个结构体的起点地址是重合的。
  • 所以如果把这个结构体转换成Base类型,就可以直接作为base结构体来访问
  • 后面如果还需要访问多出来的z属性,可以转换回Derived类型
目录
结构体继承小知识点