/* 隐式转换:例如数值类型转换,但程序员需要确保目标类型不会越界 */ char ch; int i = 65; float f = 2.5; int j; int x = 650; ch = static_cast<char>(i); // int to char, ch -> 'A' j = static_cast<double>(f); // float to int, j -> 2 ch = static_cast<char>(x); // char范围为 -128-127,x为650,越界,ch存的是错误的值
/* 整数与枚举类型转换 */ enum classColor { RED, GREEN, BLUE };
Color color = Color::GREEN; int colorValue = static_cast<int>(color); // 将枚举类型转换为整数,colorValue=1 int intValue = 2; Color enumColor = static_cast<Color>(intValue); // 将整数转换为枚举类型, enumColor=Color::BLUE
/* 将任何指针类型显式转换为 `void*`类型 ,将`void*`转换为目标类型指针 */ int i = 65; void *pv = static_cast<void *>(&i); char *pc = static_cast<char *>(pv); // *pc为 'A' int* pi = static_cast(int *)(nullptr);
classDerived : public Base { public: voidshow(){ std::cout << "Inside Derived class" << std::endl; } };
Derived derivedObj; Base* basePtr = static_cast<Base*>(&derivedObj); // Upcasting basePtr->display(); // Accessing Base class member // basePtr->show(); // Error: Base class pointer cannot access Derived class member
/* 多继承向上类型转换,指向 D 类型对象的指针可以安全地强制转换为 B 或 C。 但是,如果 D 强制转换为指向 A 对象的指针,会产生 A 的哪个实例? 这将导致不明确的强制转换错误。 若要解决此问题,可以执行两个明确的强制转换 */
classA { virtualvoidf(); };
classB : public A { virtualvoidf(); };
classC : public A { virtualvoidf(); };
classD : public B, public C { virtualvoidf(); };
D *pd = new D; A *pa = dynamic_cast<A *>(pd); // C4540, ambiguous cast fails at runtime B *pb = dynamic_cast<B *>(pd); // first cast to B A *pa2 = dynamic_cast<A *>(pb); // ok: unambiguous
/* 在给定 E 类型对象和指向 D 子对象的指针的情况下,若要从 D 子对象导航到最左侧的 A 子对象,可以进行三次转换。 可以执行从 D 指针到 E 指针的 dynamic_cast 转换,然后执行从 E 到 B 的转换(可以是 dynamic_cast,也可以是隐式转换),最后执行从 B 到 A 的隐式转换 */
classA { virtualvoidf(); };
classB : public A { virtualvoidf(); };
classC : public A { };
classD { virtualvoidf(); };
classE : public B, public C, public D { virtualvoidf(); };
D *dPtr = newE(); E *pe = dynamic_cast<E *>(dPtr); B *pb = pe; // upcast, implicit conversion A *pa = pb; // upcast, implicit conversion
/* 横向类型转换 */ D *dPtr = newE(); B *pb = dynamic_cast<B *>(dPtr); // 横向类型转换 A* pa = pb; // upcast, implicit conversion