动态铸造-两者之间的区别
Dynamic cast - Difference between the two
假设我有两个类
class foo
{
.......
virtual ~foo() {..}
};
class foobar : public foo
{
};
以下不会导致错误:
foo* c = new foo();
foobar* j = dynamic_cast<foobar*>(c);
但是,以下强制转换在运行时会导致错误:
foo c;
foo &d = c;
foobar& j = dynamic_cast<foobar&>(d);
为什么强制类型转换适用于指针而不适用于引用?
正如预期的那样,在这两种情况下强制转换都会失败。
在第一种情况下,它返回一个nullptr
,您应该在取消引用指针之前对其进行测试。在第二种情况下,不存在任何可以返回的内容,并且强制转换引发了std::bad_cast
异常。这就是dynamic_cast
的设计目的。
当指针/引用实际指向派生类的对象时,可以使用dynamic_cast
。但在您的情况下,对象实际上属于foo
类,而不是foobar
类。所以第一个将给出nullptr
,第二个将引发异常。
foo* ob = new foobar();
foobar* f_ob = dynamic_cast<foobar*>(ob);
类似以供参考。
没有null reference
。dynamic_cast
无法返回nullptr来指示此对象的动态类型与目标类型不兼容,因此它引发std::bad_cast。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 当两者都调用时,删除和析构函数之间的区别?
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- 如何删除字符串中的所有空格并将数据存储在两者之间
- 如何区分线段和两者之间的空格?C++
- 如何将数据从顶点着色器传递到介于两者之间的片段着色器
- 生成 0 或 1,而不是介于两者之间
- 为什么指针减法会导致介于两者之间的元素数量
- 告诉我两者之间的区别.它是在树上插入的C 代码
- 两者之间的最佳方法是什么:实例化对象或使用指针
- 这两者之间有什么区别?(字符)
- 这两者之间的区别。和这个>
- 两者之间的区别 |和 ||,或 & 和 &&
- 两者之间的区别
- 如何使构造函数在两者之间返回
- 动态铸造-两者之间的区别
- SDL2 -添加表面到表面,纹理到纹理或两者之间的东西
- <vector> 当一个元素从两者之间移除时,STL 会发生什么?
- 这两者之间有什么区别?&我应该使用什么?