Avatar ·

regular cast、static_cast 和 dynamic_cast 在 C++ 中的区别是什么?

大家好!我正在学习 C++,对类型转换感到困惑。教材中经常写道:“避免使用 C-style cast”,但没有解释原因。我编写了一个简单的类层次结构:有一个基类 `Shape` 和派生类 `Circle` 和 `Rectangle`。当我尝试将指向 `Shape*` 的指针转换为 `Circle*` 时,我使用普通的 C-style cast:`(Circle*)shape_ptr`。似乎可以工作,但编译器有时会报错或程序崩溃。后来我了解到 `static_cast` 和 `dynamic_cast`。 下面是一个让我困惑的例子: ```cpp class Shape { public: virtual ~Shape() {} }; class Circle : public Shape { public: void drawCircle() { /* ... */ } }; class Rectangle : public Shape { public: void drawRect() { /* ... */ } }; void process(Shape* s) { // 选项 1:C-style cast Circle* c1 = (Circle*)s; c1->drawCircle(); // 如果 s 是 Rectangle,有时会崩溃 // 选项 2:static_cast Circle* c2 = static_cast(s); c2->drawCircle(); // 可以编译,但也很危险 }