c++ - 如何在引用上正确使用 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 文档:
您无法通过将结果(动态转换产生的引用)与零进行比较来验证使用引用类型的动态转换是否成功,因为没有零引用之类的东西。对引用类型的动态转换失败会引发 bad_cast 异常。
因此,要验证转换是否成功,只需确保它没有引发异常。
推荐阅读
- python - 如何在硒中修复此错误/警告?
- node.js - 阅读我的回复时我得到未定义但 React.js 中有回复
- .net - 为什么 roslyn SyntaxGenerator 不生成 params 数组和可选参数?
- angular - 角度反应形式验证子控件中的所需状态
- micronaut - 使用 HttpClient 的 Micronaut 读取超时
- sql - oracle中的多行到单行转换
- azure-sql-database - 如何对逻辑 Azure SQL Server 进行地理围栏?
- python - 使用 Selenium 按标签查找元素
- python - 使用 pip 为 python 3.9.5 安装控件时出现 python setup.py 错误
- javascript - 在javascript中从数组中解压缩多个函数参数