我发现自己处于一种我知道某物是什么类型的情况下。类型是三个(或更多)继承级别之一。我调用返回的工厂,B*
但是 T 是类型的最高级别(如果我的代码知道它是什么)或第二级别。
无论如何,我static_cast
在模板中做了一个错误的事情。我的问题是我什么时候可以安全地进行静态投射?有没有这样的时候?我在这种情况下这样做是因为当我不小心将 T 作为古怪的东西(已经发生并且)动态转换忽略(并返回 null)时,我宁愿得到编译错误。但是,当我知道正确的类型时,指针没有调整,导致我的指针不好。我不确定为什么在这种情况下完全允许静态转换。
我什么时候可以安全地使用 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;
}