其实,static_cast相当于我们程序员对编译器的一种承诺:我们清楚地知道这样转存在的任何风险,并且我们能够接受这样的风险。所以,当我们用static_cast将父类指针转换成子类指针时,编译器不报错。而dynamic_cast是在运行时执行类型转换,用于将基类的指针安全地转换成派生类的指针,也就是说,dynamic_cast会进行动态类型检查。
因为不存在所谓空引用,所以引用类型的dynamic_cast转换与指针类型不同,在引用转换失败时,会抛出std::bad_cast异常,该异常定义在头文件typeinfo中。 voidf(constBase &b){try{constDerived &d = dynamic_cast<constBase &>(b);//使用b引用的Derived对象}catch(std::bad_cast){//处理类型转换失败的情况} } ...
英伟达C++一面static_cast与dynamic_cast的区别?dynamic_cast的原理 11:31 腾讯C++后端二面:了解写时复制技术吗?fork 的细节是怎么样的? 14:56 B站C++一面:unique_ptr是怎么实现的?unique_ptr 和 shared_ptr 删除器的设计差异? 09:31 金山WPS c++ 一面:std::sort 使用了哪种排序算法? 12:39 小米C+...
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。 首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型, 这种检查不是语法上的,而是真实情况的检查。 若对指针进行dynamic_cast,失败返回nullptr,成功返回正常cast后的对象...
Derived d; Base* ptrB = &d; Derived* ptrD = dynamic_cast<Derived*>(ptrB); // 将基类指针转换为派生类指针 if (ptrD != nullptr) { // 转换成功 } else { // 转换失败 } 综上所述,static_cast用于已知类型的静态转换,而dynamic_cast用于未知类型的动态转换。使用时需要注意类型安全和转换结果的...
dynamic_cast只能用于含有虚函数的类; 进行上行转换的时候,与static_cast 的作用一样。下行转换的时候,具有类型检查的功能,比static_cast更安全。 dynamic_cast会先检查是否能转换成功,如果能则转换,不能则返回0。 class B { public: int m_iNum; virtual void foo(); ...
classAnimal{public:virtualvoidcry()=0;}classDog:publicAnimal{public:virtualvoidcry(){cout<<"汪汪"<<endl;}voiddoHome(){cout<<"看家"<<endl;}}voidteat(){Aniaml*a=newDog();a->cry();Dog*dog=dynamic_cast<Dog*>a;if(dog!=NULL)//这种情况下 可以将父类指针转换为子类指针并且不会报错{dog...
C++ 四种cast类型转换基本上是所有的 C++项目中都要用到的,在C++中主要分为四种case,分别是:static_cast、dynamic_cast、const_cast和reinterpret_cast,下面讲逐一对这四种cast进行讨论C 风格强制类型转换 C语…
C++ 中的类型转换:static_cast、dynamic_cast 等的应用场景 一、static_cast的应用场景 基本数据类型之间的转换 可以用于基本数据类型之间的...
static_cast和dynamic_cast都可以⽤于类层次结构中基类和⼦类之间指针或引⽤的转换。所不同的是,static_cast仅仅是依靠类型转换语句中提供的信息(尖括号中的类型)来进⾏转换;⽽dynamic_cast则会遍历整个类的继承体系进⾏类型检查。⽐如:class B { public:virtual void Test(){} };class D : ...