问题描述
我们使用 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 异常。
因此要验证转换是否成功,只需确保它没有抛出异常即可。