2011-06-04 81 views
-4

下面的代码的执行产生这样的输出:的dynamic_cast

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

请首先解释一下您对输出的疑惑或奇怪。 – 2011-06-04 05:12:04

+0

为什么在标题中包含'static_cast',实际问题甚至没有提到'static_cast'? – AnT 2011-06-04 05:27:42

回答

1

* dynamic_cast *用于检查downcast的有效性。
如果指针实际指向要被转换的类型或从指向的类派生的类,它将返回一个有效的指针。

baseptr[0]指向类型derived2

随着

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

您试图检查basepte[0]实际上指向derived1或从它派生的类。很明显,它既不会返回0

相似,derptr指向derived1类型。

随着

dynamic_cast<derived1*>(derptr); 

您试图检查derptrderived1,这是正确的,因此它返回一个有效的指针类型,从而导致打印到NOT NULL。

一个警告:作为@AndreyT正确地指出dynamic_cast仅适用于Polymorphic类!

3

首先,你的代码是不可编译的。为了将dynamic_cast用于upcast之外的其他任何事情,您需要一个多态类型作为指针操作数。你正在使用它来进行[试图]十字架,而你的类型不是多态的。其次,如果你让你的类变多态(以便代码编译),那么你报告的行为真的是预期的行为。 derivedptr1指针应该确实为空,因为derived2对象不是derived1对象(并且所讨论的对象不是任何常见超级对象的组成部分)。交叉转换失败,因此dynamic_cast评估为空指针。你还期望别的吗?

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