1

2 개의 클래스 A와 B가 있습니다. B는 A에서 파생되었습니다. A에는 B의 객체 인 인수가있는 함수 포인터 멤버가 있습니다. 클래스는 다음과 같습니다. 내가 A * 또는 B *에 동적 캐스트 무효 *를하려고하면불완전한 클래스 : dynamic_cast를 통해 void *를 클래스 유형의 포인터로 변환

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

class A 
{ 
    private: 
    func_ptr func; 
}; 

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

, 나는 다음과 같은 오류 얻을 :

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 

을 내가 왜 이런 일 단서가 없다 다음과 같이 정의했다. 두 클래스 중 하나에는 가상 메소드가 없습니다. 클래스의 forward 선언은 멤버를 선언하는 데 사용할 수 없지만 여기서는 포인터를 정의하는 데 사용된다는 것을 알고 있습니다.

왜이 오류가 발생하는지 설명 할 수 있습니까?

+2

* "동적 캐스팅 시도시 * *"- dynamic_cast에서는 허용되지 않습니다. 너의 모든 문제가 그 문장에있다. – StoryTeller

+0

아마도 전사 오류 일지 모르겠지만이 세미콜론'private;은 별다른 호의를 보이지 않습니다. – user4581301

+0

@ user4581301 예, 죄송합니다. 비공개입니다 : – Harshad

답변

2

void*dynamic_cast으로 변환 할 수 없으며 dynamic_cast이 필요로하는 표현식은 완전한 클래스 유형을 참조해야하며 void은 그렇지 않습니다.

(강조 광산) BTW

lvalue of a complete class type if new_type is a reference, prvalue of a pointer to complete class type if new_type is a pointer.

: 변환 형이 너무 완전한 클래스 유형을 참조해야합니다.

  1. The result of the expression dynamic_­cast<T>(v) is the result of converting the expression v to type T....
  2. If T is a pointer type, v shall be a prvalue of a pointer to complete class type, and the result is a prvalue of type T...

또한, 정말 불분명 전혀 dynamic_cast을 사용하는 이유 :

pointer to complete class type, reference to complete class type, or pointer to (optionally cv-qualified) void

+0

감사합니다. 지금은 이해. static_cast – Harshad

1

dynamic_cast의 피연산자는 완전한 클래스 형 ([expr.dynamic.cast])에 대한 포인터해야합니다. 예제의 클래스는 다형성이 아닙니다. 시야에 가상 기능이 없습니다.

+0

고마워. 지금은 이해. static_cast를 사용해야합니다. – Harshad

관련 문제