当然我们也可以使用static_cast,只是dynamic_cast在进行下行转换的时候(即基类到派生类)具有类型检查功能,而static_cast没有。因此存在安全问题。 当我们使用智能指针时,如果需要进行类层次上的上下行转换时,可以使用std::static_pointer_cast()、std::dynamic_pointer_cast、std::const_pointer_cast()和std::reinterp...
智能指针的cast 使用static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast进行shared_ptr进行cast 对于unique_ptr却没有定义相应的方法,对于想转换unique_ptr指针,可以使用get方法,即dynamic_cast<pointerOfUnique_ptr.get()>的方法进行cast 本文使用 Zhihu On VSCode 创作并发布 ...
如果确实需要则建议使用dynamic_cast;那啥是dynamic_cast。...dynamic_cast dynamic_cast是啥,dynamic_cast这个操作运算符主要是用来执行安全向下转型,如果我们的转换目标是指针类型且转换失败,那么得到的结果为nullptr,如果转换目标是引用类型而且失败了...也就是说,我们如果将Base类型的对象,通过dynamic_cast转换为...
static_cast : 常用于基本数据类型的转换、非const转成const,不是同一继承体系的,无法转换 dynamic_cast :一般用于多态类型的转换,有运行时安全检测 reinterpret_cast:属于比较底层的强制转换,没有任何类型检查和格式转换,仅仅是简单的二进制数据拷贝 const_cast : 去除const ...
通过使用 std::dynamic_pointer_cast,当转换不合法时,程序能够安全地处理失败情况,而不是导致未定义行为。 4.2.3 避免类型安全问题 为了进一步保障类型安全,开发者应避免不必要的智能指针转换,尤其是在不完全确定对象类型的情况下。通过设计清晰的类层次结构和接口,可以减少对于类型转换的需求。同时,利用多态和虚函数可...
方法/步骤 1 首先创建一个基类和一个子类,注意定义了Print函数用于测试,并且是虚函数 2 定义存储指向子类的基类智能指针变量,然后调用dynamic_pointer_cast转换为类型为子类的智能指针变量 3 编译运行输出的打印信息如下,能够正常调用子类的Print函数 4 定义存储指向子类的子类智能指针变量,然后调用dynamic_pointer_...
与dynamic_cast类似,SafeDownCast也是运行时才转换的,这种转换只有当bmpReader的类型确实是reader Base的派生类时才有效,否则返回空指针。 除了运行时类型识别,vtkObjectBase还提供了用于调试的状态输出接口Print(),其调用内部PrintSelf()、PrintHeader()、PrinrTailer()等函数实现。在调试VTK程序时,如果需要输出某个对象...
intn=10;charc='a';void*p=nullptr;int*k=static_cast<int*>(p);n=static_cast<int>(c);//n就变成了97,ASCLL码中字符a的位置, 相当于int n = (int)c; dynamic_cast动态类型转换: 主要用于面向对象中多态应用场景,用于基类指针和派生类指针或者基类引用和派生类引用的安全转换,提供动态的安全检查。派...
智能指针之间可以通过reset、get、static_pointer_cast、dynamic_pointer_cast等方法进行转换。 reset:重置智能指针并使它指向新的对象。 get:获取智能指针所管理的对象的裸指针。 static_pointer_cast:进行静态类型转换。 dynamic_pointer_cast:进行动态类型转换。 下面通过代码示例来演示智能指针的转换: #include <iostre...