这是我得到的.

typedef struct SysInfo_P
{
    int some_P_int
    char some_P_char[10];
    ...

} SysInfo_P;


typedef struct SysInfo_S
{
    int some_S_int
    char some_S_char[10];
    ...

} SysInfo_S;


typedef struct Device
{
    struct SomeData *data;
    void *sysInfo;
    ...
} Device;

其 idea 是拥有一个基类设备,并在分配期间将其void指针投射到适当的SysInfo_x类.我总是使用void个指针来为常见函数提供多功能性,但我似乎无法理解这一点……也许这是做不到的.

这是我徒劳的try ..在我的分配器里.

self->sysInfo = (SysInfo_S *)malloc(sizeof(*self->properties->sysInfo));
memset(self->sysInfo, 0, sizeof(*self->properties->sysInfo));

推荐答案

德布什的答案将会奏效,而且可能是理想的.然而,如果您试图在C中模仿OOP,您就会有点颠倒过来.通常,基会成为子类的第一个成员.这是因为它是标准的一部分,允许您将 struct 的地址转换为第一个Of成员类型的指针.所以大概是这样的:


typedef struct Device
{
    struct SomeData *data;
    ...
} Device;

typedef struct SysInfo_P
{
    Device base;
    int some_P_int
    char some_P_char[10];
    ...
} SysInfo_P;


typedef struct SysInfo_S
{
    Device base;
    int some_S_int
    char some_S_char[10];
    ...
} SysInfo_S;

然后,你可以做legally件这样的事情:

SysInfo_P* sysinfo = malloc(sizeof(*sysinfo));
Device* parent = (Device*)sysinfo;

C++相关问答推荐

POSIX文件描述符位置

ATTiny1606定时器TCA 0中断未触发

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何在POSIX-UEFI中获得输入?

为 struct 中的数组动态分配内存时出错

添加函数会 destruct 嵌入式C代码(无IDE)

无法访问共享目标文件内的共享指针

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

判断系统命令返回值的正确方法

OSDev--双缓冲重启系统

为什么WcrTomb只支持ASCII?

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

如果类型是新的,offsetof是否与typeof一起工作?

为什么这个代码的最后一次迭代不能正常工作?

通过char*访问指针的对象表示是未定义的行为吗?

与指针的原始C数组或C++向量<;向量<;双>>;

System V 消息队列由于某种原因定期重置

为什么创建局部变量的指针需要过程在堆栈上分配空间?

K&R 练习 1-24