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都编译通过
static_cast 主要用于非多态类型之间的转换,包括浮点数和整型之间的转换,以及父类指针向子类指针的转换(需要程序员保证安全性)。具体用法如下:
cppCopy Code// 非多态类型之间的转换 int i = 10; double d = static_cast<double>(i); // 父类指针向子类指针的转换 class Base {}; class Derived : public Base {}; Base* basePtr = new Derived(); Derived* derivedPtr = static_cast<Derived*>(basePtr);
在使用 static_cast 进行父类指针向子类指针的转换时,需要注意程序员自己保证转换的安全性,因为 static_cast 不会进行运行时的类型检查。
dynamic_cast 主要用于多态类型之间的转换,即含有虚函数的类之间的转换,它会在运行时进行类型检查。具体用法如下:
cppCopy Codeclass Base { public: virtual ~Base() {} }; class Derived : public Base {}; Base* basePtr = new Derived(); Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); if (derivedPtr) { // 转换成功 } else { // 转换失败 }
在使用 dynamic_cast 进行父类指针向子类指针的转换时,如果转换合***返回转换后的指针;如果转换不合法,则返回空指针。需要注意的是,使用 dynamic_cast 进行类型转换时,基类必须至少包含一个虚函数,否则编译器会报错。
总结来说,static_cast 主要用于静态类型转换,而 dynamic_cast 用于动态类型转换,并且在多态类型之间的转换上具有更多的安全性。