假设我有通常的class Animal
抽象类,并且class Dog : public Animal
class Cat : public Animal
它使它成为一个具体类,你可以实例化一个对象.进一步假设你有一个功能foo(Animal a)
,以猫或狗为对象.C++过去常常编译为C,并会vTable
在那里构建维护对象.
但是我的一个学生问我这个问题:在这些概念通常是程序员之间的谈话之前,他们是如何在C语言的日常编码中实际做到的?什么是(是?)在C中编程这些概念的惯用方法?
我已经筛选了linux内核和其他OSS项目,但是我还没有找到一个清晰的模式:有时它是unions(对于不同的结构),有时它是函数指针等等但是我想要一个直接的答案来自行业知识渊博的人,他们已经完成并拥有丰富的C经验.
用一句话来说:什么是惯用的C继承和多态?
简单的程序,例如为学校作业编写的程序,使用由联合和可选的枚举作为类型鉴别器的结构实现多态.然后,每个"方法"都包含一个switch语句,该语句调用适合该子类型的函数.显然,这不会扩展到需要能够在不改变基类定义的情况下添加子类的更多系统.
多态性本身很容易用接收显式self
参数的函数指针表示.使用嵌入其超类的"继承"结构可以实现开放式继承:
struct base { // ... members here ... }; struct inherited { struct base base; // ... inherited members here ... };
struct inherited
可以安全地施放指针struct base *
,这是C标准明确祝福的做法.这些强制转换通常隐藏在宏之后,甚至可能在可能的情况下执行运行时类型检查.
实现这一点非常笨拙,因为没有模板,没有自动调用析构函数,没有例外,也没有STL.换句话说,错误处理和调用析构函数必须仔细由程序员处理,和类型差异必须通过回调在运行时(考虑之间的差异进行处理std::sort()
和qsort()
)或难以维持预处理器技巧.
尽管存在这些困难,但在C语言中实现C++功能的有意义的子集肯定是可能的,甚至可以在过程中实现C的简单性.要研究这种方法在生产级别上的实际示例,请查看CPython解释器的实现,或GTK +使用的glib对象系统.