我有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
我不知道为什么会这样。两个类中都没有虚拟方法。我知道类的前向声明不能用于声明成员,但在这里它被用来定义指针。
任何人都可以解释为什么我会收到此错误吗?
答案 0 :(得分:2)
您无法按dynamic_cast
转换void*
,dynamic_cast
所需的表达式必须引用完整的类类型,而void
则不是。
(强调我的)
如果new_type
是引用,则完整类类型的左值;如果
new_type
是指针,则指向完整类类型的指针的prvalue
BTW:转换类型也应该引用完整的类类型。
完整类类型的指针,对完整类类型的引用或指向(可选cv-qualified)的指针void
答案 1 :(得分:1)
dynamic_cast
的操作数必须是指向完整类类型([expr.dynamic.cast])的指针:
- 表达式
的结果dynamic_cast<T>(v)
的结果是将表达式v转换为类型T ....- 如果T是指针类型,则v应该是指向完成类类型的指针的prvalue,结果是类型为T的prvalue ...
醇>
此外,为什么你根本不使用dynamic_cast
。示例中的类不是多态的。看不到虚拟功能。