C ++ dynamic_cast问题

时间:2014-06-12 14:23:03

标签: c++ dynamic-cast

class C1
{
   public:
   C1* A;

   void SomeMethod()
   {
       class C2;
       C2* c2 = dynamic_cast<C2*>(A);
    }
};

class C2 : public C1 {};

在gcc中,当调用dynamic_cast时,我得到“target不是指针或对完整类型的引用”。怎么了?

2 个答案:

答案 0 :(得分:2)

以下编译:

class C2;

class C1
{
   virtual ~C1() { } // <--- NOTE MUST BE polymorphic to use dynamic_cast
   public:
   C1* A;

   void SomeMethod();
};

class C2 : public C1 {};

void C1::SomeMethod()
{
       C2* c2 = dynamic_cast<C2*>(A); // <=== USED after C2 definition 
}

int main() {

}

两个问题:

  1. C2只是前向声明,因此是一个不完整的类型(需要完整的类声明)
  2. C1不是多态的(dynamic_cast仅适用于多态类型)

答案 1 :(得分:0)

class C2;
C2* c2 = dynamic_cast<C2*>(A);

第一行告诉编译器&#34;有一个类类型&#34; C2&#34;当你找到定义&#34;。

时,它将在后面的编译单元中完全定义

如果您尝试将C2实例用作引用或指针声明之外的任何内容(直到需要定义类),您将收到错误,告诉您指针不是完全定义的类型(&# 34;或&#34;用编译语言完成类型&#34;。

修复:

#include <C2.h> // header where "class C2 { ... };" is defined

// no longer necessary: class C2;
C2* c2 = dynamic_cast<C2*>(A); // this should now compile