动态_cast<;D*>;(pb)返回空值 < C++ >引物(第五)19.2.1关于动态模型。它说,要想成功地dynamic_cast(e)
e的类型必须是公开派生自的类类型 目标类型,目标类型的公共基类,或与目标相同 类型 但是,对于以下代码:动态_cast<;D*>;(pb)返回空值 < C++ >引物(第五)19.2.1关于动态模型。它说,要想成功地dynamic_cast(e),c++,dynamic-cast,C++,Dynamic Cast,e的类型必须是公开派生自的类类型 目标类型,目标类型的公共基类,或与目标相同 类型 但是,对于以下代码: class B{ public: virtual ~B(){} }; class D : public B{}; B *pb = new B; D *pd = dynamic_cast<D*>(pb); if(pd == 0) cout << "err" << endl; B类{ 公众: 虚拟~B(){} }; D类:公共B{}; B*p
class B{
public:
virtual ~B(){}
};
class D : public B{};
B *pb = new B;
D *pd = dynamic_cast<D*>(pb);
if(pd == 0) cout << "err" << endl;
B类{
公众:
虚拟~B(){}
};
D类:公共B{};
B*pb=新的B;
D*pd=动态铸造(pb);
如果(pd==0)coutdynamic\u cast
可以用作检测对象是否派生自另一个对象的工具,那么在您编写的代码中,答案是否定的,因此您得到了空值。借
B *pb = new B;
D *pd = dynamic_cast<D*>(pb);
pb
的类型确实是D
的公共基类,但是pb
指向的对象不是任何D
类型的对象的基子对象。动态强制转换检测到这一点并返回null
如果确实尝试将指针强制转换为D
对象的基子对象,则将获得指向D
对象的(非空)指针:
D obj;
B *pb = &obj; // points at subobject
assert(&obj == dynamic_cast<D*>(pb));
D对象;
B*pb=&obj;//指向子对象的点
断言(&obj==dynamic_cast(pb));
您所引用的需求仅仅是一个静态需求,它允许您使用动态强制转换——但它没有描述使用强制转换的结果。这将在后面介绍。pb
必须首先指向D
。你有一个B
。你误解了这个词。@StoryTeller:既然pb
有类型B*
,它只能指向aB
@KerrekSB-D
is-aB
,但是:根据你的想法,这个要求有点误导。Thanks@YuanWen:不太好。该要求说明您不能编写类似于dynamic\u cast(4)
,比如说。
D obj;
B *pb = &obj; // points at subobject
assert(&obj == dynamic_cast<D*>(pb));