- 论坛徽章:
- 24
|
原帖由 zhujiang73 于 2008-5-21 15:41 发表
加上成员函数:
#include
typedef struct
{
void *p;
int ma;
} A;
typedef struct
{
A parent;
void *p;
int mb;
} B;
typedef ...
再加上多态:
#include <stdio.h>
typedef struct
{
void *p;
int ma;
void (*vshow)(void *this);
} A;
typedef struct
{
A parent;
void *p;
int mb;
char name[2];
} B;
typedef struct
{
void (*set_ma)(void *this, int a);
} AC;
typedef struct
{
AC parent;
void (*set_mb)(void *this, int b);
} BC;
void A_set_ma(void *this, int a)
{
((A*)this)->ma = a;
}
void B_set_mb(void *this, int b)
{
((B*)this)->mb = b;
}
void B_vshow(void *this)
{
printf("this is %s \n", ((B*)this)->name);
}
void AC_init(AC *pac)
{
pac->set_ma = A_set_ma;
}
void BC_init(BC *pbc)
{
AC_init((AC*)pbc);
pbc->set_mb = B_set_mb;
}
void A_init(A *pa, AC *pac)
{
pa->p = (void*)pac;
}
void B_init(B *pb, BC *pbc)
{
((A*)pb)->vshow = B_vshow;
pb->p = (void*)pbc;
pb->name[0] = 'B';
pb->name[1] = '\0';
}
int main (int argc, char *argv[])
{
BC bc;
A *pa;
B b1, b2;
B *pb1, *pb2;
pb1 = &b1;
pb2 = &b2;
BC_init(&bc);
B_init(pb1, &bc);
B_init(pb2, &bc);
((AC*)(pb1->p))->set_ma((void*)pb1, 10);
((AC*)(pb2->p))->set_ma((void*)pb2, 100);
((BC*)(pb1->p))->set_mb((void*)pb1, 20);
((BC*)(pb2->p))->set_mb((void*)pb2, 200);
pa = (A*)pb1;
pa->vshow((void*)pa);
printf("b1.ma = %d b1.mb = %d \n", b1.parent.ma, b1.mb);
printf("b2.ma = %d b2.mb = %d \n", b2.parent.ma, b2.mb);
return 0;
}
|
|
|