struct A1 { virtual ~A1() {} }; struct A2 { virtual ~A2() {} }; struct B1 : A1, A2 {}; int main() { B1 d; A1* pb1 = &d; A2* pb2 = dynamic_cast<A2*>(pb1); //L1 A2* pb22 = static_cast<A2*>(pb1); //L2 return 0; }
struct A1 { virtual ~A1() {} }; struct A2 { virtual ~A2() {} }; struct B1 : A1, A2 {}; int main() { B1 d; A1* pb1 = &d; A2* pb2 = dynamic_cast<A2*>(pb1); //L1 A2* pb22 = static_cast<A2*>(pb1); //L2 return 0; }
L1语句编译失败,L2语句编译通过
L1语句编译通过,L2语句编译失败
L1,L2都编译失败
L1,L2都编译通过
代码中的 L2 语句编译失败的原因是因为static_cast进行静态类型转换时,只能在拥有继承关系的类之间进行转换。而在这里,A1和A2是独立的基类,并没有直接的继承关系。
虽然在结构体B1中同时继承了A1和A2,但是由于它们是独立的基类,相互之间没有继承关系,因此无法使用static_cast直接将指向A1的指针转换为指向A2的指针。
相比之下,L1 语句中使用的是dynamic_cast,它用于在运行时进行类型转换,并且可以处理多态类型(至少有一个虚函数)之间的转换。因此,在 L1 语句中,虽然pb1指针的静态类型是A1*,但是它指向的是一个同时继承了A1和A2的对象,所以可以通过dynamic_cast将其转换为A2*类型的指针。
总结起来,static_cast只能进行相关类之间的静态类型转换,而dynamic_cast则可以在运行时进行多态类型之间的转换。在这个例子中,因为A1和A2是独立的基类,没有直接的继承关系,所以无法使用static_cast进行转换,但可以使用dynamic_cast进行转换