这是我得到的..
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;
这个想法是有一个基类 Device,并在分配期间将其
void
指针转换为适当的 SysInfo_x
类。我一直使用 void
指针来为常用函数提供多功能性,但我似乎无法理解这一点......也许它无法做到。
这是我徒劳的尝试将其投射到我的分配器中。
self->sysInfo = (SysInfo_S *)malloc(sizeof(*self->properties->sysInfo));
memset(self->sysInfo, 0, sizeof(*self->properties->sysInfo));
你想要的是一个
union
:
typedef struct Device
{
struct SomeData *data;
union {
struct SysInfo_S s;
struct SysInfo_P p;
} sysInfo;
...
} Device;
dbush 的答案将会起作用并且可能是理想的。然而,如果你试图用 C 语言模仿 OOP,那么你的情况就有点相反了。通常,基类成为子类的第一个成员。这是因为它是标准的一部分,允许您将结构的地址强制转换为第一个成员类型的指针。所以像这样:
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;
然后,您可以合法地做这样的事情:
SysInfo_P* sysinfo = malloc(sizeof(*sysinfo));
Device* parent = (Device*)sysinfo;