面试题答案
一键面试static_cast
- 适合场景:用于基本数据类型之间的转换,以及具有继承关系的类之间的转换(向上转换,即子类指针/引用转换为父类指针/引用)。例如,将
int
转换为float
:
int num = 10;
float f = static_cast<float>(num);
在类继承体系中向上转换:
class Animal {};
class Dog : public Animal {};
Dog dog;
Animal* animalPtr = static_cast<Animal*>(&dog);
- 原因:
static_cast
比C风格类型转换更安全,C风格类型转换可以在不同类型之间进行任意转换,包括不相关类型,容易导致难以察觉的错误。而static_cast
会在编译期进行类型检查,对于不允许的转换(如不相关类类型之间转换)会报错,提高了类型安全性。
dynamic_cast
- 适合场景:主要用于在运行时进行类型检查,尤其是在多态类型的继承体系中,将父类指针/引用安全地转换为子类指针/引用。当需要在运行时确定对象的实际类型,并进行向下转换时使用。例如:
class Shape {};
class Circle : public Shape {};
class Rectangle : public Shape {};
Shape* shapePtr = new Circle();
Circle* circlePtr = dynamic_cast<Circle*>(shapePtr);
if (circlePtr) {
// 转换成功,是Circle类型
} else {
// 转换失败,不是Circle类型
}
- 原因:C风格类型转换没有运行时类型检查机制,在进行向下转换时如果类型不匹配会导致未定义行为。
dynamic_cast
会在运行时检查对象的实际类型,如果转换类型不匹配,返回nullptr
(指针转换时)或抛出std::bad_cast
异常(引用转换时),从而保证了类型转换的安全性。