我熟悉如何在C++中进行动态转换,具体操作如下:
myPointer = dynamic_cast<Pointer*>(anotherPointer);
但是如何使这个“安全”的动态转换呢?
我熟悉如何在C++中进行动态转换,具体操作如下:
myPointer = dynamic_cast<Pointer*>(anotherPointer);
dynamic_cast
无法将指针强制转换为所需类的完整对象时,会返回空指针以表示失败。
如果使用dynamic_cast
进行引用类型转换并且无法进行转换,则抛出bad_cast类型的异常。
问 但是如何将它变成“安全的”动态转换呢?
答 只要将 dynamic_cast
的参数传递为有效指针(包括NULL),它就是一个安全的动态转换。如果你传递了一个悬挂指针或者是垃圾值,那么调用 dynamic_cast
将不保证安全。事实上,最好的情况是运行时系统抛出异常,你可以处理它。最糟糕的情况是未定义的行为。现在你可以得到一种行为,下次可能会有不同的行为。
你可能尝试滥用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<>
,这会导致未定义行为: