A &a = d;// upcast, dynamic_cast may be used, but unnecessary [[maybe_unused]] B &new_b = dynamic_cast<B &>(a);// sidecast new_b.hello(); c)否则,运行时检查失败。如果在指针上使用dynamic_cast,则返回new-type类型的空指针值。如果它用于引用,则抛出异常std::bad_cast。 6. 当dynami...
在前面的例子中,使用了dynamic_cast将基类指针转换为派生类指针,也可以使用dynamic_cast将基类引用转换为派生类引用。 同样的,引用的向上转换总是安全的: Derived c; Derived& der2=c; Base& base2= dynamic_cast<Base&>(der2);//向上转换,安全base2.Show(); 所以,在引用上,dynamic_cast依旧是常用于“安全...
chara ='a';intb = static_cast<char>(a);//正确,将char型数据转换成int型数据double*c =newdouble;void*d = static_cast<void*>(c);//正确,将double指针转换成void指针inte =10;constintf = static_cast<constint>(e);//正确,将int型数据转换成const int型数据constintg =20;int*h = static_ca...
总结: 1、从子类到基类指针的转换:static_cast和dynamic_cast都是正确地,所谓正确是指方法的调用和数据的访问输出是期望的结果,所谓成功是说转换没有编译错误或者运行异常; 2、从基类到子类:static_cast和dynamic_cast都是正确的,其中static_cast的结果是非空指针,dynamic_cast的结果是空指针; 这里,static_cast是错...
static_cast: 一般的转换,no run-time check.通常,如果你不知道该用哪个,就用这个。 reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。 1)static_cast<T*>(a) 编译器在编译期处理 将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。
C * pC = static_cast<C *>(&b); //不允许 1. 2. 3. 4. 5. 第一种转换是合法的,因为向上转换可以显示地进行。第二种转换是从基类指针到派生类指针,在不进行显示类型转换的情况下,将无法进行。但是由于无需进行类型转换,便可以进行另一个方向的类型转换,因此使用 static_cast 来进行向下转换是合法的...
static_cast是最常用的类型转换操作符,它可以用于基础数据类型之间的转换(如int转double),类类型之间的转换(如基类指针转派生类指针,但这种情况下需要开发者自己确保转换的安全性),以及非const转const等。 示例代码: inti =42;double d = static_cast(i);//int转doubleconstintc =10;int*p = const_cast(&c)...
基本区别: dynamic_cast是语言关键字。用于执行从基类型到派生类型的转换,基类型要求至少有一个虚函数(virtual funciton),也就是说主要针对类指针和引用这些动态类型。这个操作符实际上只是检查引用或者指针…
C继承自B,B继承自A,这种多重继承的关系;但是,关系很明确,使用dynamic_cast进行转换时,也是很简单的: classA{// ...};classB:publicA{// ...};classC:publicB{// ...};intmain(){C*pC=newC;B*pB=dynamic_cast<B*>(pC);// OKA*pA=dynamic_cast<A*>(pC);// OK} 而上述的转换,...
1 static_cast 用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换。 进行上行转换(把子类的指针或引用转换成基类表示)是安全的; ...