相当于 C++ 中的 C NULL 函数指针
Equivalent of C NULL function pointer in C++?
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
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针