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