首页 > 解决方案 > 如何在引用上正确使用 dynamic_cast 的返回值?

问题描述

我们使用dynamic_cast运算符将​​指针或对基类型的引用安全地转换为指针或对派生类型的引用。

    struct Foo{
    void f() const{
        std::cout << "Foo::f()\n";
    }
    virtual ~Foo() = default;
};

struct Bar : Foo{
    void f() const {
        std::cout << "Bar::f()\n";
    }
};

int main(){

    Foo* pf = new Foo{};
    Bar* pb = dynamic_cast<Bar*>(pf);
    if(pb)
        pb->f();
    delete pf;

    pf = new Bar{};
    pb = dynamic_cast<Bar*>(pf);
    if(pb)
        pb->f();
    delete pf;

    Bar b{};
    Foo& rf = b;
    Bar& rb = dynamic_cast<Bar&>(rf);

    // if(rb) // ?
        rb.f();
}

标签: c++referencedynamic-cast

解决方案


用作@1201ProgramAlarm 评论的占位符。

简单的说,

引用的动态转换失败会引发异常。– 1201程序报警

来自IBM 文档

您无法通过将结果(动态转换产生的引用)与零进行比较来验证使用引用类型的动态转换是否成功,因为没有零引用之类的东西。对引用类型的动态转换失败会引发 bad_cast 异常。

因此,要验证转换是否成功,只需确保它没有引发异常。


推荐阅读