C作为面向对象的语言

Mau*_*lli 11 c

您是否可以建议C语言的语法以与面向对象语言类似的方式使用它?我知道它们不能相同,并且C中没有一些关键字,但我想知道是否有办法利用某些方面(如继承),即使在C程序中也是如此.

Tro*_*nic 10

您可以使用常规函数和虚拟表(vtable)实现多态性.这是一个非常简洁的系统,我发明了(基于C++)进行编程练习:替代文字

构造函数分配内存,然后调用类初始化内存的init函数.每个init函数还应包含一个静态vtable结构,其中包含虚函数指针(纯虚拟的NULL).派生类init函数在执行任何其他操作之前调用超类init函数.

通过实现虚函数包装器(不要与vtables指向的函数混淆)可以创建一个非常好的API,如下所示(static inline如果你在标题中添加它,则在它前面添加):

int playerGuess(Player* this) { return this->vtable->guess(this); }
Run Code Online (Sandbox Code Playgroud)

单继承可以通过滥用结构的二进制布局来完成: 替代文字

请注意,多重继承更加混乱,因为在层次结构类型之间进行转换时,通常需要调整指针值.

其他类型特定的数据也可以添加到虚拟表中.示例包括运行时类型信息(例如,类型名称作为字符串),链接到超类vtable和析构函数链.您可能需要虚拟析构函数,其中派生类析构函数将对象降级为其超类,然后递归调用它的析构函数,依此类推,直到到达基类析构函数并最终释放结构.