在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版)的错误吗?或者我只是误解了这些话?
答案 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);