"安全"动态演员?

时间:2014-03-31 05:57:38

标签: c++ oop casting

我熟悉如何在C ++中进行动态强制转换,如下所示:

myPointer = dynamic_cast<Pointer*>(anotherPointer);

但是你如何使这成为一个“安全”的动态演员呢?

3 个答案:

答案 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_basenullptr / 0或者确实指向从Base派生的对象,上述内容就是“安全”(已定义的行为),否则这是未定义的行为。

此外,您可以使用dynamic_cast<>执行运行时不安全的操作,从而产生未定义的行为:

  • Standard 12.7 / 6:“如果dynamic_cast的操作数引用正在构造或销毁的对象,并且操作数的静态类型不是构造函数或析构函数自己的类或其中一个的指针或对象它的基础,dynamic_cast导致未定义的行为。“。标准提供了一个例子来说明这一点。