dynamic_cast <d * =“”>(pb)返回null

时间:2017-11-08 05:55:35

标签: c++ dynamic-cast

在C ++入门(第5期)19.2.1中关于dynamic_cast。它说,dynamic_cast<type*>(e)成功,

  

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;

输出为“错误”。但是pb的类型是D类型的公共基类。

这是C ++入门(第5版)的错误吗?或者我只是误解了这些话?

2 个答案:

答案 0 :(得分:4)

./gradle的类型确实是pb的公共基类,但D指向的对象不是任何对象的基础子对象类型为pb。动态转换检测到此并返回null。

如果您确实尝试将指针强制转换为D对象的基础子对象,则会得到指向D对象的(非空)指针:

D

您引用的要求仅仅是允许您使用动态强制转换的静态要求 - 但它没有描述使用强制转换的结果。这将在后面描述。

答案 1 :(得分:2)

dynamic_cast可用作检测对象是否来自另一个对象的工具,在您编写的代码中,答案为否,因此您获得了null。由

B *pb = new B;
D *pd = dynamic_cast<D*>(pb);

你正在将基础向下转换为派生的,它与文档所说的相反。当然,如果pb指向extact D*

,则可以在下方
B *pb = new D; // <--- It is a `D`
D *pd = dynamic_cast<D*>(pb);