我发现自己遇到了这样一种情况:我知道某个类型的类型属于三个(或更多)继承级别之一。我调用一个工厂,它返回 B*
,但是如果我的代码已经知道 T 的类型,则 T 可能是类型的最高级别(或第二级别)。
总之,在模板中我使用了 static_cast
,这是错误的做法。我的问题是什么时候可以安全地进行静态强制转换?有没有这样的时候?在这种情况下,我这样做是因为当我无意中将 T 设为奇怪的东西时,我宁愿得到编译错误,而动态转换会忽略它并返回 null。但是,当我知道正确类型时,指针未被调整,导致我有一个错误的指针。我不确定为什么在这种情况下允许使用静态转换。
在什么情况下可以安全地使用静态转换进行向下转换?有没有这样的情况?现在似乎总是错误的使用 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;
}
struct DD : B {D1 d1; D2 d2;};
) - Ayjay