A Za, A Za, Fighting...

坚信:勤能补拙

2011知识点 - 多态的C实现

示例代码:

/* how to simulate C++'s polymorphism with C */
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>

/* declaration of virtual method */
typedef 
void (*Func1)(void);
typedef 
void (*Func2)(int);
typedef 
void (*Func3)(char *);

/* ------------------- Base Class begin ------------------*/
void func1_base(void)
{
    printf(
"func1_base(void) called\n");
}

void func2_base(int item)
{
    printf(
"func2_base(%d) called\n", item);
}

struct Vtbl_Base {
    Func1 f1;
    Func2 f2;
};
struct Vtbl_Base bvtbl = {&func1_base, &func2_base};

struct Base {
    
void *vptr; /* pointer to VTABLE */
    
int field_base;
};

void Base_Init(struct Base *baseint value)
{
    
base->vptr = &bvtbl;
    
base->field_base = value;
}

/* ------------------- Base Class end ------------------*/

/* ------------------- Derived Class begin ------------------*/
void func1_derived(void)
{
    printf(
"func1_derived(void) called\n");
}

void func3_derived(char *item)
{
    printf(
"func3_derived(%s) called\n", item);
}

struct Vtbl_Derived {
    
struct Vtbl_Base vtbl_base;
    Func3 f3;
};
struct Vtbl_Derived dvtbl = {{&func1_derived, &func2_base}, &func3_derived};

struct Derived {
    
struct Base base;
    
int field_derived;
};

void Derived_Init(struct Derived *derived, int b, int d)
{
    Base_Init((
struct Base *)derived, b);
    derived
->base.vptr = &dvtbl;
    derived
->field_derived = d;
}

/* ------------------- Derived Class end ------------------*/

void 
test_polymorphism(
struct Base *obj)
{
    ((
struct Vtbl_Base *)(obj->vptr))->f1();
    ((
struct Vtbl_Base *)(obj->vptr))->f2(obj->field_base);
}

int
main(
int argc, char **argv)
{
    
struct Base base;
    Base_Init(
&base128);
    test_polymorphism(
&base);

    
struct Derived derived;
    Derived_Init(
&derived, 128256);
    test_polymorphism((
struct Base *)&derived);

    ((
struct Vtbl_Derived *)(*(int *)&derived))->f3("polymorphism");
}

posted on 2011-10-20 17:22 simplyzhao 阅读(278) 评论(0)  编辑 收藏 引用 所属分类: R_找工复习2011


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2011年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜