不完整的类:通过dynamic_cast将void *转换为指向类类型的指针

时间:2017-12-12 05:36:12

标签: c++ casting forward-declaration dynamic-cast incomplete-type

我有2个A和B类.B从A派生.A有一个函数指针成员,参数是B的对象。类定义如下:

class B;
typedef double (*func_ptr)(B *);

class A
{
  private:
    func_ptr func;
};

class B: public A
{
  private:
    double C;
};

当我尝试将void *动态转换为A *或B *时,我收到以下错误:

void *v_ptr;
A *a_ptr = dynamic_cast<A*>(v_ptr);
B *b_ptr = dynamic_cast<B*>(v_ptr);

error: the operand of a pointer dynamic_cast must be a pointer to a complete class type

我不知道为什么会这样。两个类中都没有虚拟方法。我知道类的前向声明不能用于声明成员,但在这里它被用来定义指针。

任何人都可以解释为什么我会收到此错误吗?

2 个答案:

答案 0 :(得分:2)

您无法按dynamic_cast转换void*dynamic_cast所需的表达式必须引用完整的类类型,而void则不是。

(强调我的)

  如果new_type是引用,则

完整类类型的左值;如果new_type是指针,则指向完整类类型的指针的prvalue

BTW:转换类型也应该引用完整的类类型。

  

完整类类型的指针,对完整类类型的引用或指向(可选cv-qualified)的指针void

答案 1 :(得分:1)

dynamic_cast的操作数必须是指向完整类类型([expr.dynamic.cast])的指针:

  
      
  1. 表达式dynamic_­cast<T>(v)的结果是将表达式v转换为类型T ....
  2. 的结果   
  3. 如果T是指针类型,则v应该是指向完成类类型的指针的prvalue,结果是类型为T的prvalue ...
  4.   

此外,为什么你根本不使用dynamic_cast。示例中的类不是多态的。看不到虚拟功能。