c - C 中的半继承 : How does this snippet work?

标签 c oop inheritance

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

typedef struct {
    int x;
} base;

typedef struct {
    base super;
    int y;
} derived;

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

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);

所以我的问题是,这究竟是如何工作的?是不是因为当您将其转换为 base 并引用变量时,您将 int 成员“x”引用为距“base”结构开头的偏移量?这是我唯一能想到的,我们将不胜感激。

非常感谢!

最佳答案

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

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

关于c - C 中的半继承 : How does this snippet work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3322650/

相关文章:

java - 新关键字的副作用

javascript - 将其传递给 jQuery 插件

c# - 为什么C#中同时存在抽象类和接口(interface)?

c - 读取地址所指向的数据

c - 为什么 container_of 不在 glibc 中?

c - 在 ## 串联之前评估预处理器 token

c++ - 基类指针,基于派生类型调用方法

javascript - Node JS 中的原型(prototype)继承

c++ - 使用来自另一个类实例的函数指针调用成员函数

c++ - 当条件为真时,有什么方法可以连接宏参数吗?