总体来看,子类指针转成父类指针无论怎样都是安全、允许的(上面的2、4),所以static_cast和dynamic_cast都可以安全使用。 再说上面的1、3。 其实,static_cast相当于我们程序员对编译器的一种承诺:我们清楚地知道这样转存在的任何风险,并且我们能够接受这样的风险。所以,当我们用static_cast将父类指针转换成子类指针时...
static_cast和dynamic_cast都是C++中的类型转换操作符,但它们有着不同的用途和限制: static_cast:静态类型转换 static_cast进行的是编译时的类型转换,只能用于已知的类型之间的转换,且不能转换掉const、volatile等属性。主要用于基本数据类型的转换、隐式转换的显式化和向上转型(子类指针或引用转为父类指针或引用)。
dynamic_cast< type_id >(expression) type_id 必须是类的指针、类的引用或者void*。 主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。 dynamic_cast只能用于含有虚函数的类; 进行上行转换的时候,与static_cast 的作用一样。下行转换的时候,具有类型检查的功能,比static_cast更安全。 dynamic_c...
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。 首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型, 这种检查不是语法上的,而是真实情况的检查。 若对指针进行dynamic_cast,失败返回nullptr,成功返回正常cast后的对象...
1. static_cast static_cast是静态类型转换,“静态”一词是指在程序编译期间完成类型的转换,这应该是平时使用最多的类型转换。例如,将一个浮点数转化为整数,就可以使用static_cast: 复制代码 floata =10.5;intb =static_cast<int>(a); 2. dynamic_cast ...
类型转换基本上是所有的C++项目中都要用到的,在C++中主要分为四种case,分别是:static_cast、dynamic_cast、const_cast和reinterpret_cast,下面讲逐一对这四种cast进行讨论 C 风格强制类型转换 C语言风格的强制类型转换比较强大且万能,需要使用类型转换的地方都可以使用C语言风格的强制类型转换进行转换。正是因为这种万能...
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...
答:static_cast?用于有比较明确定义的变换,包括不需要强制转换的变换。 dynamic_cast适用于类型安全的向下转换,常用在继承中的父类指针向子类指针的转换。若转换成功则返回改类型的指针,若失败,则返回NULL。 1.Struct?和class?的区别。 答:struct是一种结构体类型的标志,它和C++中的Class很相似。 C++中两者的唯一...
static_cast和dynamic_cast都可以⽤于类层次结构中基类和⼦类之间指针或引⽤的转换。所不同的是,static_cast仅仅是依靠类型转换语句中提供的信息(尖括号中的类型)来进⾏转换;⽽dynamic_cast则会遍历整个类的继承体系进⾏类型检查。⽐如:class B { public:virtual void Test(){} };class D : ...
子类转基类:dynamic_cast和static_cast的效果是一样的; 基类转子类:dynamic_cast具有类型检查的功能,比static_cast更安全。 下面通过一段代码来看看两者的区别 class base{ public: int age; string name; public: virtual void func(); //如果用到dynamic_cast,则基类需要提供虚方法 ...