dynamic_cast何时返回0并且何时抛出异常? CPP

时间:2016-12-18 22:22:01

标签: c++

在此链接中: http://www.cplusplus.com/doc/tutorial/typecasting/

  

当dynamic_cast无法转换指针时,因为它不是完整的   所需类的对象-as在第二次转换中   前面的例子 - 它返回一个空指针来指示失败   如果使用dynamic_cast转换为引用类型和   转换是不可能的,抛出bad_cast类型的例外   代替。

我无法从这个文本部分理解,当dinamic_cast返回null ptr时,以及抛出异常时的确切条件是什么。

如果有人可以向我展示两个代码示例,其中一个返回null ptr而另一个抛出异常,那将非常合适。感谢。

3 个答案:

答案 0 :(得分:5)

区别在于:

DerivedClass *der = dynamic_cast<DerivedClass *>(someBaseClassPtr);

如果nullptr未引用someBaseClassPtr的对象,则会返回DerivedClass

DerivedClass& der = dynamic_cast<DerivedClass&>(someBaseClassObj);

如果someBaseClassObj实际上没有引用DerivedClass的对象,则会抛出异常。

答案 1 :(得分:1)

如果失败的强制转换是指针,则返回空指针;如果是引用,则抛出异常。

答案 2 :(得分:0)

如果没有基类具有虚方法,

dynamic_cast也将返回null_ptr。它没有VTable可以使用。最佳做法是将基础类的destructor声明为虚拟。