我有一个 C++ 库,它使用这样的对象层次结构:
class A { ... }
class B : public A { ... }
class C : public A { ... }
我通过 typedef 和函数通过 C API 公开功能,如下所示:
#ifdef __cplusplus
typedef A* APtr;
#else
typedef struct A* APtr;
#endif
extern "C" void some_function(APtr obj);
但是,假设使用 C API 会执行以下操作:
BPtr b = bptr_create();
some_function((APtr) b);
这是多态有效的,因为 B 扩展了 A,并且我的 API 依赖于这样的功能是可能的,但我想确保它仍然可以与 C++ 代码正确互操作,即使 B 覆盖了 A 的一些虚拟方法。
更重要的是,为什么或为什么不?C++ 如何在运行时识别obj
参数 ofsome_function
实际上是指向 B 的指针,并因此调用其重写的虚方法?