C中的半继承:这个代码片段如何工作?

ado*_*dol 5 c oop inheritance

在C中破解有限形式的多态性的一种方法是执行以下操作:

typedef struct {
    int x;
} base;

typedef struct {
    base super;
    int y;
} derived;
Run Code Online (Sandbox Code Playgroud)

现在,您可以将派生实例作为基本实例引用,具体取决于变量的转换方式,即:

derived my_derived;
my_derived.y = 10;
my_derived.super.x = 20;
//will print 10
printf("%d", (&my_derived)->y);
//will print 20
printf("%d", ((base*)(&my_derived) )->x);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这究竟是如何工作的?是因为当你把它作为基础并引用变量时,你引用int成员'x'作为'base'结构开头的偏移量?这是我唯一能想到的,任何帮助都会受到赞赏.

非常感谢!

Jam*_*lis 11

在结构中,数据元素之间或结构的末尾可以有未命名的填充字节,但不是在开头.因此,结构类型对象的第一个数据元素的地址保证与结构类型对象本身的地址相同.

因此,在您的示例中,地址与地址my_derived相同my_derived.super.

  • +1这实际上是由C规范保证的. (2认同)