因为static_cast的转换时粗暴的,它仅根据类型转换语句中提供的信息(尖括号中的类型)来进行转换,这种转换方式对于上行转换,由于子类总是包含父类的所有数据成员和函数成员,因此从子类转换到父类的指针对象可以没有任何顾虑的访问其(指父类)的成员。而对于下行转换为什么不安全,是因为static_cast只是在编译时进行类型坚持...
因此这里是向上转换,合法【基类指针本身就可指向派生类指针】Low *pl = static_cast<Low *>(&bar);//bar是基类,pl是派生类指针,因此是向下转换,合法【但是要注意向下转换虽合法,但不安全,因为向下转换,访问到成员变量可能会崩溃,一般使用动态转换】
相当于C语言的强制类型转换,在编译时进行类型检查,没有运行时的类型检查,合法性需要开发者自己保证。 dynamic_cast dynamic_cast<target-type>(expression) dynamic_cast动态类型转换,主要用于继承关系中的指针和引用类型的转换。在运行时进行检查,保证下行转换的安全性。 上行转换 子类指针转换为父类指针,使用dynamic_c...
编译器就能看到这种不相关类指针转换的不安全,报出错误。注意这时不是以warning形式给出的,而直接是不可通过编译的error。从提示信息里可以看到,编译器说如果需要这种强制转换,要使用reinterpret_cast(稍候会说)或者C风格的两种转换。 总结一下:static_cast最接近于C风格转换了,但在无关类的类指针之间转换上,有安全...
static_cast 用法:static_cast < type-id > ( expression_r_r ) 该运算符把expression_r_r转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指...
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。 classBase{public:intm_iNum;virtualvoidfoo();};classDerived:publicBase{public:char*...
在类层次间进行上行转换时,dynamic_cast和static_cast 的效果是一样的; 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast 更安全。 另外要注意:B要有虚函数,否则会编译出错;static_cast 则没有这个限制。 dynamic_cast 在运行效率上比static_cast 要差一些,但static_cast 在更宽上范围内能够完毕...
在进行下行转换时,dynamic_cast具有类型检查的功能,比 static_cast更安全。向上转换即为指向子类对象。向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。
8) 一个没有明确声明为const的成员函数被看作是将要修改对象中数据成员的函数,而且编译器不允许它为一个const对象所调用。因此const对象只能调用const成员函数。 9) const类型变量可以通过类型转换符const_cast将const类型转换为非const类型; 10) const类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有co...
1. 概念 dynamic_cast: 该运算符用于将基类的指针或引用安全的转换成派生类的指针或引用,具有运行时类型识别(run-time type identification,RTTI)的功能。 static_cast:任何明确定义的类型转换,只要不包含底层const,都可以使用static_cast. 2.举例 运行结果:L1语句编译通过,L2语句编译失败(类型转换无效)。 考点......