我熟悉如何在C ++中进行动态强制转换,如下所示:
myPointer = dynamic_cast<Pointer*>(anotherPointer);
但是你如何使这成为一个“安全”的动态演员呢?
答案 0 :(得分:7)
当dynamic_cast
无法转换指针因为它不是所需类的完整对象时,它返回一个空指针以指示失败。
如果dynamic_cast
用于转换为引用类型并且无法进行转换,则会抛出类型为bad_cast的异常。
答案 1 :(得分:0)
问但是,如何让这个“安全”动态演员?
A 只要dynamic_cast
的参数是有效指针(包括NULL),它就是一个安全的动态转换。如果您传递悬空指针或垃圾值,则无法保证对dynamic_cast
的调用是安全的。事实上,最好的情况是运行时系统抛出一个异常,你可以处理它。最糟糕的情况是它是未定义的行为。您现在可以获得一种行为,下次可以获得不同的行为。
答案 2 :(得分:0)
您尝试滥用dynamic_cast
的大多数方式都会导致编译器错误(例如,尝试强制转换为不在相关多态层次结构中的类型)。
当您有效地使用dynamic_cast
询问特定指针是否实际寻址特定派生类型的对象时,还有两种运行时行为:
if (Derived* p = dynamic_cast<Derived*>(p_base))
{
...can use p in here...
}
else
...p_base doesn't point to an object of Derived type, nor anything further
derived from Derived...
try
{
Derived& d = dynamic_cast<Derived&>(*p_base);
...use d...
}
catch (std::bad_cast& e)
{
...wasn't Derived or further derived class...
}
只要p_base
是nullptr
/ 0
或者确实指向从Base
派生的对象,上述内容就是“安全”(已定义的行为),否则这是未定义的行为。
此外,您可以使用dynamic_cast<>
执行运行时不安全的操作,从而产生未定义的行为: