dynamic_cast的实现

时间:2011-06-04 05:08:16

标签: c++

以下代码生成此输出:

1 is a null pointer
2 is not a null pointer

代码

class base {};
class derived1: public base {};
class derived2: public base {};

int main() {
    base *baseptr[1];
    baseptr[0] = new derived2;
    derived1 *derptr = new derived1;
    derived1 *derivedptr1 = dynamic_cast<derived1*>(baseptr[0]);
    derived1 *derivedptr2 = dynamic_cast<derived1*>(derptr);
    cout<<((derivedptr1==0)?"1 is null pointer":"1 is not a null pointer") << endl;
    cout<<((derivedptr2==0)?"2 is null pointer":"2 is not a null pointer") << endl;
}

为什么derivedptr2只是初始化而derivedptr1不是?因为两者都有有效的右手边价值。这是否与动态转换有关,以及在第二种情况下我将derived1 *转换为derived1 *?

2 个答案:

答案 0 :(得分:3)

首先,您的代码无法编译。为了将dynamic_cast用于除了upcast之外的任何其他内容,您需要一个多态类型作为指针操作数。您正在将它用于[尝试]交叉投射,并且您的类型不是多态的。

其次,如果您使您的类具有多态性(以便代码编译),那么您报告的行为实际上是预期的行为。 derivedptr1指针确实应该为空,因为derived2对象不是derived1对象(并且所讨论的对象不是任何常见超级对象的一部分)。交叉转换失败,因此dynamic_cast计算为空指针。你还有什么期待吗?

在第二种情况下(对于derivedptr2),您有derived1 *derived1 *的“身份”广告。类型是相同的,所以这个演员基本上是一个无操作。它只是评估原始值。

答案 1 :(得分:1)

* dynamic_cast * 用于检查向下转发的有效性 如果指针实际指向要转换的类型或从指向的类派生的类,则返回有效指针。

baseptr[0]指向derived2类型。

使用

dynamic_cast<derived1*>(baseptr[0]);

您正在尝试检查basepte[0]是否实际指向derived1或从中派生的类。显然,它既不会返回0

类似地,derptr指向类型derived1

dynamic_cast<derived1*>(derptr);

您正在尝试检查derptr是否指向derived1,这是正确的,因此它会返回有效的指针类型,从而导致打印到非空。

警告: 正如@AndreyT正确指出dynamic_cast仅适用于Polymorphic类!