GLibなどのCスタイルの継承を使用するCAPIを使用する場合(C構造体の標準レイアウトを利用)、通常は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スタイルのキャストを使用する方が良いと思います。
では、ここでのベストプラクティスは何ですか?