我有一个奇怪的问题,即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上。
答案 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
>在第二次演员中)明确是多态的。