小赖子的英国生活和资讯

理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型

阅读 桌面完整版

C++ 中的 dynamic_cast 是什么?

用途

基本语法

Derived* d = dynamic_cast<Derived*>(basePtr);

转换失败的情况

  1. 指针转换: 如果实际对象不是目标类型,则返回 nullptr
  2. 引用转换: 如果失败,会抛出 std::bad_cast 异常

指针向下转型示例

class Entity {
    virtual ~Entity() {}
};

class Player : public Entity {};
class Enemy : public Entity {};

Entity* e = new Enemy;
Player* p = dynamic_cast<Player*>(e);

if (p) {
    // 可以安全使用 p
} else {
    // p 是 nullptr
}

引用向下转型示例

try {
    Entity& e_ref = *new Enemy;
    Player& p_ref = dynamic_cast<Player&>(e_ref);
} catch (const std::bad_cast& ex) {
    // 捕获异常
}

派生类转基类(向上转型)

向上转型示例

class Entity {
    virtual void say() {}
};

class Player : public Entity {
    void jump() {}
};

Player p;
Entity* e = &p;  // 隐式向上转型,安全
e-*gt;say();        // 正确
// e->jump();    // 错误:Entity 中没有 jump()

dynamic_cast 的使用条件

static_castdynamic_cast 比较

特性 static_cast dynamic_cast
编译期检查
运行期安全
失败时可检测 ❌(行为未定义) ✅(返回 nullptr 或抛出异常)
需要虚函数

总结

C/C++编程

英文:Understanding dynamic_cast in C++: Safe Downcasting Explained

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version