以下代码生成此输出:
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 *?
答案 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
类!