static_cast、dynamic_cast、reinterpret_cast 和 C 风格类型转换在 C++ 中的区别是什么?
大家好!我刚开始学习 C++,怎么也搞不清楚类型转换。书上和论坛里提到 `static_cast`、`dynamic_cast`、`reinterpret_cast`,还有旧的 C 风格圆括号转换。在 C 语言中,我直接写 `(int)myDouble` 就能用。但在 C++ 中,别人告诉我这样做不好,应该使用 C++ 风格的转换。
例如,我有一个类层次结构:
```cpp
class Base { public: virtual ~Base() {} };
class Derived : public Base { public: void foo() {} };
```
我想把 `Base*` 转换为 `Derived*`。似乎可以写 `(Derived*)basePtr`,而且能编译通过。但最好用哪个?我听说 `dynamic_cast` 在转换失败时会返回 `nullptr`,而 `static_cast` 不会。还有 `reinterpret_cast`,它几乎能破坏一切。
请帮我弄清楚:什么时候该用哪种 cast?有没有 C 风格转换仍然可以接受的情况?为什么 C++ 要搞出这么多不同的转换方式?