Advertisement

C语言面向对象编程第3章:深入解析虚函数与多态

阅读量:

《C++ 编程思想》一书对虚函数的实现原理进行了详尽的阐述,通常情况下,编译器会借助虚函数表,在编译阶段插入一段隐含的代码,用于存储类型信息以及虚函数的地址。当执行调用时,这段隐藏的代码能够准确地定位到与实际对象匹配的虚函数实现。

在此处,我们提供一种在 C 语言中实现的方法,模拟 VTABLE 的运行机制,但所有操作都需要我们自行在代码中完成。

此前在网络上曾读到一篇关于如何在 C 语言中实现虚函数和多态的文章。文中提到通过在基类中保存派生类指针,并在派生类中保存基类指针的方式,以实现相互调用。这种方法在一定程度上可以模仿 C++ 中使用虚函数的行为。然而我认为这种方式存在较大的局限性。不说继承层次带来的复杂性问题,在基类中保存派生类指针这一做法本身已经违背了多态设计的核心理念——多态的目的在于通过基类接口来操作派生类对象。如果基类还需要了解派生类的信息,则显然偏离了这一初衷。

我的基本设计思路如下:

  • 在“基类”内部显式定义一个 void** 类型的成员变量,用于存储所有由基类定义的函数指针,并且声明一个 int 类型的变量以标明该 void* 数组的具体长度。
  • 基类所定义的每个函数指针在数组中的位置和排列顺序是固定不变的,这是必须遵循的一种约定。
  • 每个“派生类”都需负责填充该数组(可能需要进行动态扩展),对于未重写的部分,则将对应位置设置为 0。

全部评论 (0)

还没有任何评论哟~