当使用使用 C 风格继承的 C API 时(利用 C 结构的标准布局),例如GLib,我们通常使用 C 风格强制转换来向下转换:
struct base_object
{
int x;
int y;
int z;
};
struct derived_object
{
base_object base;
int foo;
int bar;
};
void func(base_object* b)
{
derived_object* d = (derived_object*) b; /* Downcast */
}
但是,如果我们正在编写使用这样的 C-API 的新 C++ 代码,我们应该继续使用 C 风格的强制转换,还是应该更喜欢 C++ 强制转换?如果是后者,我们应该使用什么类型的 C++ 转换来模拟 C 向下转换?
起初,我认为reinterpret_cast
会合适:
derived_object* d = reinterpret_cast<derived_object*>(b);
但是,我总是很谨慎,reinterpret_cast
因为 C++ 标准几乎不能保证会发生什么。使用它可能更static_cast
安全void*
:
derived_object* d = static_cast<derived_object*>(static_cast<void*>(b))
当然,这真的很麻烦,让我觉得在这种情况下最好只使用 C 风格的强制转换。
那么这里的最佳实践是什么?