相当于 C++ 中的 C NULL 函数指针

Equivalent of C NULL function pointer in C++?

本文关键字:函数 指针 NULL C++ 中的 相当于      更新时间:2023-10-16

C 中实现"面向对象"的常见做法是使用函数指针数组。这似乎类似于 C++ vtable,本质上C++虚函数机制只是围绕函数指针数组的语法糖。
但是 C 机制还有一个附加功能,这是C++中缺少的。函数指针可以是 NULL,调用方可以检查函数是否为 NULL,以查看对象是否实现了某个方法。但是,在C++中,方法不能为 NULL,类不能"不实现"方法。

在C++中模仿这种行为的最接近的方法是什么?

这种做法有时被称为胖接口,被认为是一种反模式。

正确的面向对象方法是提供几个子类的层次结构,即将"可选"方法分离到一个额外的接口中,并且只让一些类实现该接口。

通过测试类是否

是相关接口的实例来测试类是否实现这些方法。

(顺便说一下,在 C 中也是如此 - 尽管我从未在严肃的项目中使用过 C,但我怀疑你是否应该在那里使用NULL函数指针,而不是建模正确的类型层次结构。

我认为这不是C++的有效用法,C++你应该对接口进行编程。梅托要么存在,要么不存在。您似乎认为C++只是带有类的 C。它更多一点。

接口要么说有方法,要么说没有。这提供了 C 语言所没有的编译时安全性。

有一个基虚函数,它在基类中抛出异常(我们称之为not_implemented)。

无论如何,您通常不想这样做。您最好有一个适当的类层次结构,如其他评论中所述。

最接近的方法是设计一个类层次结构来准确地对 C 样式的 vtables 实现的内容进行建模。

具有不同数量元素的两个函数指针 (vtables) 数组正在对两个单独的类进行建模。这是很明显的,但也应该很明显,即使数组的大小相同,具有不同数量的非空元素的 vtable 也会对单独的类进行建模。

例如,假设我们有一个 vtable 和两个对象,像这样聚合它:

    VTABLE                 OBJECT A               OBJECT B
   STRUCTURE
+-------------+        +-------------+        +-------------+
| pfnCreate   |        | 0x.....     |        | 0x.....     |
+-------------+        +-------------+        +-------------+
| pfnUpdate   |        | 0x.....     |        | NULL        |
+-------------+        +-------------+        +-------------+
| pfnDelete   |        | 0x.....     |        | 0x.....     |
+-------------+        +-------------+        +-------------+

这两个对象不属于同一个类(至少使用类的C++定义),因此不能仅使用一个类对事态进行建模也就不足为奇了。 翻译成C++,这看起来像

class Something {
public:
    void Create();
    void Delete();
};
class UpdatableSomething : public Something {
public:
    void Update();
}

其中 B 是Something,A 是UpdatableSomething

听起来您正在尝试在运行时进行兼容性检查。有几种方法可以构建类层次结构,您可以使用胖接口,其中基类实现所有可能的派生函数,如果派生类未覆盖实现,则让它们在执行时抛出错误。这就是你在 C 中所做的。

实现

此目的的另一种更理想的方法是通过功能类并使用多重继承来混合功能。

查看第 9-11 页以获取有关设计和实现此内容的更多详细信息。

http://www.umich.edu/~eecs381/lecture/IdiomsDesPattsStructural.pdf