gpt4 book ai didi

c - 在明确概念之前,多态和继承的 C 习语是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:56:01 26 4
gpt4 key购买 nike

假设我有通常的 class Animal 抽象类和 class Dog : public Animal class Cat : public Animal 使它成为一个具体的您可以从中实例化对象的类。进一步假设您有一个函数 foo(Animal a),将猫或狗作为对象。在早期,C++ 用于编译为 C,并构建一个 vTable 维护那里的对象。

但我的一个学生问我这个问题:在这些概念成为程序员之间的常谈之前,他们是如何实际上在他们的日常 C 编码中做到这一点的?用 C 编写这些概念的惯用方法是什么(现在是?)?

我已经筛选过 linux 内核和其他 OSS 项目,但我一直无法找到一个清晰的模式:有时它是 union (针对不同的结构),有时它是函数指针等,但我想来自业内知识渊博的人的直截了当的回答,他们已经使用 C 并拥有丰富的经验。

一句话:继承和多态的惯用C是什么?

最佳答案

简单的程序,例如为学校作业编写的程序,使用由 union 和可选的枚举组成的结构作为类型鉴别器来实现多态性。然后,每个“方法”都包含一个 switch 语句,该语句调用适合该子类型的函数。显然,这不会扩展到更多需要能够在不更改基类定义的情况下添加子类的系统。

多态性本身很容易用接收显式 self 参数的函数指针来表达。开放式继承可以通过嵌入其父类(super class)的“继承”结构来实现:

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 对象系统。

关于c - 在明确概念之前,多态和继承的 C 习语是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24410296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com