Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态_cast<;D*>;(pb)返回空值 < C++ >引物(第五)19.2.1关于动态模型。它说,要想成功地dynamic_cast(e)_C++_Dynamic Cast - Fatal编程技术网

动态_cast<;D*>;(pb)返回空值 < C++ >引物(第五)19.2.1关于动态模型。它说,要想成功地dynamic_cast(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

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*pb=新的B;
D*pd=动态铸造(pb);

如果(pd==0)cout
dynamic\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*
,它只能指向a
B
@KerrekSB-
D
is-a
B
,但是:根据你的想法,这个要求有点误导。Thanks@YuanWen:不太好。该要求说明您不能编写类似于
dynamic\u cast(4)
,比如说。
D obj;
B *pb = &obj;   // points at subobject

assert(&obj == dynamic_cast<D*>(pb));