如何正确使用来自 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();
}
  • 那么如何检查 dynamic_cast 返回的是有效引用还是无效引用? - 对于指针,只要我们将指针与 nullptr 值进行比较就可以了,但对于引用如何?

解决方法

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

简单地说,

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

来自IBM docs

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

因此要验证转换是否成功,只需确保它没有抛出异常即可。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...