私は、何かがどのタイプであるかを知っている状況にいることに気づきました。Type は、3 つ (またはそれ以上) の継承レベルの 1 つです。私は返す factory を呼び出しますB*
が、T は型の最高レベル (私のコードがそれが何であるかを知っている場合) または 2 番目のレベルのいずれかです。
とにかく、私はstatic_cast
間違ったことをテンプレートで行いました。私の質問は、安全に静的キャストできるのはいつですか? そんな時ってありますか?この場合、動的キャストが無視する (そして null を返す) 奇抜なものとして T を誤って持っていると、むしろコンパイル エラーが発生するので、この場合に実行しました。ただし、正しい型がわかっている場合、ポインターが調整されないため、ポインターが正しくありません。この場合、静的キャストが許可される理由がまったくわかりません。
ダウン キャストに static_cast を安全に使用できるのはいつですか? 状況はありますか?今では、 a を使用するのは常に間違っているようですstatic_cast
(目的がダウンキャストである場合)
わかりました、それを再現する方法を見つけました。
#include <iostream>
struct B { virtual void f1(){} };
struct D1 : B {int a;};
struct D2 : B {int a, b; };
struct DD : D1, D2 {};
int main(){
void* cptr = new DD(); //i pass it through a C interface :(
B* a = (B*)cptr;
D2* b = static_cast<D2*>(a); //incorrect ptr
D2* c = dynamic_cast<D2*>(a); //correct ptr
std::cout << a << " " <<b << " " <<c;
}