C ++ dynamic_cast返回NULL,尽管object是派生类型

时间:2017-06-21 13:02:39

标签: c++ visual-c++ dynamic-cast

我有一个奇怪的问题,即dynamic_cast返回一个NULL指针,尽管表达式中给出的对象是派生类型,具有转换类型的继承路径。

不幸的是,我无法发布原始代码,所以这里是大致重建的情况:

我有以下类型的clas层次结构:

class A
class B
class C : public A, B
class D : public C

所有课程都有虚拟成员。

现在假设我有一个具体类型D的对象。

在将此对象作为B *传入的函数中,我有一个这种类型的强制转换:

C* func(B* pObject)
{
  return dynamic_cast<C*>(pObject);
}

虽然对象似乎定义得很好,但转换返回NULL。 当将鼠标悬停在pObject上时,VC ++在调试器中查看对象时将其报告为D。 (这可能会产生误导吗?)

这个演员应该有效吗? Imo这个演员应该被允许。我错过了什么吗? 我该怎么做才能分析这个问题? 多重继承可能存在问题吗?

如果它有所不同,这是在Visual C ++ 2013 Pro上。

1 个答案:

答案 0 :(得分:3)

你的问题在别处。

考虑

#include <iostream>
struct A {};
struct B {virtual ~B() = default;};
struct C : A, B {};
struct D : C {};
int main()
{
    D d;
    D* pd = &d;
    B* pb = dynamic_cast<B*>(pd);
    C* pc = dynamic_cast<C*>(pb);
    std::cout << pc; // this is not nullptr
}

这证明只有C*源类型B*获得指向D类型对象的指针B >在第二次演员中)明确是多态的。

请参阅https://ideone.com/ifxYgV