2011-08-15 9 views
1

A *에서 C *로 암시 적 변환이 필요합니다. A의 정의 또는 구현을 변경할 수 없습니다.암시적인 방식으로 다른 유형 간의 유형 변환

class A 
{ 
}; 

struct B: public A 
{ 
}; 

struct C: public B 
{ 

}; 

난 다음 쓸 때 :

A* p; 
C* q = p; 

내가 오류 C2440을 얻고있다; A *에서 C *로 변환 할 수 없습니다. A. 내가 변경할 수없는 사실을 알려주는 것은 무엇입니까 A. 두 클래스 모두 기본 데이터의 일반 구조체입니다. 이 작업을 수행 할 수

+0

C를 변경할 수 있으면 A *를 취하는 변환 생성자를 만들 수 있습니다. A가 실제로 C라는 사실을 확실히 알고 있다면 dynamic_cast 또는 static_cast 을 사용할 수 있습니다. A가 C가 아닌 경우 자신이하는 일을 다시 생각해보십시오. –

답변

5

유일한 방법은 캐스팅 사용하는 것입니다 A의 유도체이다

// a C++ style static_cast: 
C* q = static_cast<C*>(p); 

// or the less verbose C-style cast 
C* q = (C*)p; 

C 때문에하지 모든 AC입니다, 그것은 암시처럼 당신이 수 (주조 될 수 없다 마다 CA (즉, 은 "이하 또는 동등한 특징"이이지만 그 이상은 아니기 때문에) C*A*으로 암시 적으로 전송하십시오.

나는 정말로 에 포인터 유형 간의 암시 적 캐스트가 있어야 함을 의심합니다. 네가 그렇게 생각하는 게 뭐야?

+0

C는 확장 부분이 C로만 내부적으로 사용되는 A의 확장 구조입니다. 그리고 할당 부분은 C와 A의 일치 멤버 만 할당해야합니다. – sramij

+1

@sramij 암시 적 캐스트가 필요한 것과 관련이있는 것은 무엇입니까? 포인터는 그렇게 작동하지 않습니다. "A의 일치하는 멤버 만 지정"할 수는 없습니다. _object_ (포인터가 아님)를 캐스팅하려는 경우 변환 연산자를 정의 할 수 있습니다. 하지만 당신은 포인터에 대해 그렇게 할 수 없습니다. –