为了账号安全,请及时绑定邮箱和手机立即绑定

如何在C中模拟OO风格的多态?

如何在C中模拟OO风格的多态?

C
翻阅古今 2019-07-30 11:00:58
如何在C中模拟OO风格的多态?有没有办法在C编程语言中编写类似OO的代码?也可以看看:你能用C编写面向对象的代码吗?C中的面向对象通过搜索“[c] oo”找到。
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

第一个C ++编译器(“C with classes”)实际上会生成C代码,所以这绝对可行。


基本上,你的基类是一个结构; 派生结构必须在第一个位置包含基本结构,因此指向“derived”结构的指针也将是指向基本结构的有效指针。


typedef struct {

   data member_x;

} base;


typedef struct {

   struct base;

   data member_y;

} derived;


void function_on_base(struct base * a); // here I can pass both pointers to derived and to base


void function_on_derived(struct derived * b); // here I must pass a pointer to the derived class

这些函数可以作为函数指针的结构的一部分,因此像p-> call(p)这样的语法变得可能,但你仍然必须显式地将指向结构的指针传递给函数本身。


查看完整回答
反对 回复 2019-07-30
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

C ++离C不远。

类是具有指向名为VTable的函数指针表的隐藏指针的结构。Vtable本身是静态的。当类型指向具有相同结构的Vtables但指针指向其他实现时,您将获得多态性。

建议将调用逻辑封装在以struct为参数的函数中,以避免代码混乱。

您还应该在函数中封装结构实例化和初始化(这相当于C ++构造函数)和删除(C ++中的析构函数)。无论如何这些都是很好的做法。

typedef struct{
   int (*SomeFunction)(TheClass* this, int i);
   void (*OtherFunction)(TheClass* this, char* c);} VTable;typedef struct{
   VTable* pVTable;
   int member;} TheClass;

要调用方法:

int CallSomeFunction(TheClass* this, int i){
  (this->pVTable->SomeFunction)(this, i);}


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 571 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信