在C++中,通过转换运算符来实现安全的类型转换(type casting):static_cast、dynamic_cast、const_cast、reinterpret_cast。
nullptr,并为引用抛出异常。何时使用:
dynamic_cast。对于简单/兼容类型之间的转换,使用static_cast。示例:
struct Base { virtual ~Base() {} }; struct Derived : Base { void foo() {} }; void test_cast(Base* base) { // 转换为子类的安全方式 Derived* d = dynamic_cast<Derived*>(base); if (d) { d->foo(); } }
问题: 如果对象实际上不是派生类的实例,是否可以使用static_cast将基类对象转换为派生类?
答案: 是的,static_cast可以编译,但如果对象实际上不是派生类的对象,行为将是未定义的。只有dynamic_cast才能保证这种转换的安全性。仅当确信对象的实际类型时,才能对downcast使用static_cast。
故事
在大型嵌入式系统中,基类和派生类之间的转换通过static_cast进行。在某些情况下,这导致尝试访问不存在的字段时程序崩溃——程序试图解释其他类型的内存。
故事
在开发插件架构时,程序员使用reinterpret_cast在不同类型之间转换指针,这导致在运行时读取垃圾数据和崩溃,特别是在尝试通过DLL进行动态转换时。
故事
在公司通用框架中,基类中忘记了虚拟析构函数,这使得dynamic_cast无法正常工作,并在通过基类指针删除对象时导致内存泄漏和损坏。