OOP by C language

本文探讨了C语言中如何通过宏定义实现结构体之间的继承,并介绍了如何利用虚函数表来实现多态特性。此外,还展示了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天又仔细研究了下 C OOP ,有点新的结果,在这分享下,下面大概说下。

......................................................

Inherit(继承)

实现继承机制很简单,结构体继承结构体,但是怎么去设计是另一个高度了,我这简单设计如下:

#define CB_CLASS_INHERIT_BEGIN(THIS, PARENT_CLASS) \ struct THIS \ { \ PARENT_CLASS super; \ #define CB_CLASS_INHERIT_END() \ }; \ #define CB_CLASS_POINTER_SET_PARENT(THIS, name, value) \ ((THIS)->super)->name = value; #define CB_CLASS_SET_PARENT(THIS, name, value) \ ((THIS).super).name = value; typedef struct _Base Base; struct _Base { int a; }; typedef struct _Child Child; CB_CLASS_INHERIT_BEGIN(_Child, Base) /**< _Child继承Base结构体 */ int b; int c; CB_CLASS_INHERIT_END() int main(int argc, char *argv[]) { Child m; CB_CLASS_SET_PARENT(m, a, 5); m.b = 3; printf("Parent a=%d,Child b=%d\n",m.super.a, m.b); return 0; }

Template(模板)

/* --- Struct Template --- */ #define TplTest(T) \ struct _test { \ T a; \ }; /* --- Function Template --- */ #define TplTestFun(T) \ T testFun() { \ T a = 0; \ return a; \ } int main(int argc, char *argv[]) { TplTest(char*); struct _test obj; obj.a="This is a String"; TplTestFun(int); printf("%s,%d\n", obj.a, testFun()); return 0; }

Polymorphism(多态)
C多态机制主要是实现类似C++的虚函数表

#include <Akita/Akita.h> typedef struct _Base Base; typedef struct _BaseVt BaseVt; typedef struct _Child Child; typedef struct _ChildVt ChildVt; #define GetVt(p,type) ((type*)(void*)p)->vt #define BaseShow(p) GetVt(p,BaseVt).doSomething((Base*)p); #define ChildShow(p) GetVt(p,ChildVt).doAnthing((Child*)p); void displayBase(); void displayChild(); void justDoIt(); /* --- Base --- */ struct _Base { void (*doSomething)(Base* p); /**< Function Pointer */ }; struct _BaseVt { Base vt; }; /* --- Child --- */ CB_CLASS_INHERIT_BEGIN(_Child, Base); /**< Inherit */ void (*doAnthing)(Child* p); CB_CLASS_INHERIT_END(); struct _ChildVt { Child vt; }; /* --- Base Init --- */ void InitBase(BaseVt **p) { *p = (BaseVt*)malloc(sizeof(BaseVt)); (*p)->vt.doSomething = displayBase; } /* --- Child Init --- */ void InitChild(ChildVt **p) { *p = (ChildVt*)malloc(sizeof(ChildVt)); (*p)->vt.super.doSomething = displayChild; (*p)->vt.doAnthing = justDoIt; } void displayBase() { printf("%s\n", "I'm Base"); } void displayChild() { printf("%s\n", "I'm Child"); } void justDoIt() { printf("%s\n", "I'm Child ,do anything"); } int main(int argc, char *argv[]) { BaseVt* p; InitBase(&p); BaseShow(p); InitChild((Child **)&p); BaseShow(p); ChildShow(p); return 0; }

如有疑问,请留言交流。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值