- 论坛徽章:
- 24
|
原帖由 zhujiang73 于 2008-6-6 22:05 发表
...
菱形继承:
#include <stdio.h>
#pragma pack(1)
#define SIZETAB 6
#define A_ID 1001
#define B_ID 1002
#define C_ID 1003
#define D_ID 1004
typedef struct
{
int id;
int madd;
} CInfo;
typedef struct
{
int ma;
} A;
typedef struct
{
A parent;
int mb;
} B;
typedef struct
{
A parent;
int mc;
} C;
typedef struct
{
CInfo citab[SIZETAB];
B parent01;
C parent02;
int md;
} D;
void* get_parent(void *this, int id_parent)
{
void *pp;
CInfo *pc;
pp = 0;
pc = (CInfo*)this;
int i;
for (i=0; i<SIZETAB; i++)
{
if (pc->id == 0) break;
if (pc->id == id_parent)
{
pp = this + pc->madd;
break;
}
pc++;
}
return pp;
}
void D_init(void *this)
{
CInfo *pc = (CInfo*)this;
pc->id = A_ID;
pc->madd = sizeof(CInfo)*SIZETAB;
pc++;
pc->id = B_ID;
pc->madd = sizeof(CInfo)*SIZETAB;
pc++;
pc->id = C_ID;
pc->madd = sizeof(CInfo)*SIZETAB + sizeof(B);
pc++;
pc->id = 0;
}
int main (int argc, char *argv[])
{
D d;
A *pa;
B *pb;
C *pc;
D *pd;
void *pp;
pd = &d;
D_init((void*)pd);
pp = get_parent((void*)pd, A_ID);
pa = (A*)pp;
pa->ma = 10;
pp = get_parent((void*)pd, B_ID);
pb = (B*)pp;
pb->mb = 20;
pp = get_parent((void*)pd, C_ID);
pc = (C*)pp;
pc->mc = 30;
pd->md = 40;
printf(" d.ma = %d \n d.mb = %d \n d.mc = %d \n d.md = %d \n", d.parent01.parent.ma, d.parent01.mb, d.parent02.mc, d.md);
return 0;
}
|
|
|