此问题已在此处有答案:
Object-orientation in C(23答案)
8年前关闭。
有没有可能用C语言来建模继承?怎么做?示例代码会有所帮助。
**编辑:**我希望同时继承数据和方法。单独的容器没有帮助。可替换性-使用基类对象工作的任何派生类对象-是我所需要的。
此问题已在此处有答案:
Object-orientation in C(23答案)
8年前关闭。
有没有可能用C语言来建模继承?怎么做?示例代码会有所帮助。
**编辑:**我希望同时继承数据和方法。单独的容器没有帮助。可替换性-使用基类对象工作的任何派生类对象-是我所需要的。
7条答案
按热度按时间7gs2gvoe1#
这样做很简单:
但是如果你使用MS扩展(在GCC中使用
-fms-extensions
标志),你可以使用匿名嵌套的struct
s,它看起来会更好:x8goxv8g2#
你绝对可以用(某种程度上)面向对象的风格编写C语言。
封装可以通过将结构的定义保存在.c文件中而不是关联的标头中来完成。然后外部世界通过保持指向它们的指针来处理你的对象,你提供接受这样的指针的函数作为你的对象的“方法”。
类似多态的行为可以通过使用函数指针来获得,通常分组在“操作结构”中,有点像C++对象中的“虚方法表”(或者不管它叫什么)。ops结构还可以包括其他东西,比如常量,其值特定于给定的“子类”。“父”结构可以保持对ops的引用-当然,“子类”可以在多个继承级别上重复这种模式。
因此,在下面的示例中,
struct printer
类似于一个抽象类,它可以通过填写pr_ops
结构来“派生”,并提供一个构造函数 Packagepr_create()
。每个子类型都有自己的结构,通过data
泛型指针“锚定”到struct printer
对象。这由fileprinter
子类型演示。可以想象一个基于GUI或套接字的打印机,它将被其余代码作为struct printer *
引用来操作。打印机.h:
打印机.c:
最后,fileprinter.c:
c0vxltue3#
是的,你可以使用“类型双关”技术来模拟C中的继承。也就是说,在派生类中声明基类(
struct
),并将派生类转换为基类:但是,如果你想在程序中将派生转换为基类,你必须在派生结构的第一个位置声明基类:
在此代码段中,您只能使用基类。
我在我的项目中使用了这种技术:oop4c
jxct1oxe4#
这是可能的,至少在某种程度上。
你到底需要建模什么?数据的继承还是方法的继承?
编辑:这里有一篇我找到的短文:http://fluff.info/blog/arch/00000162.htm
b4qexyjb5#
我在C语言中使用了一个对象系统,它使用了后期绑定方法,允许通过反射实现面向对象。
你可以阅读here。
krcsximq6#
wlp8pajw7#
此链接可能有用-〉link
基本示例如下