2017-10-16 17 views
3

내 소멸자 가상을 만들지 않고 C++에서 비 다형성 기본 클래스의 포인터/참조를 다운 캐스트 할 수 있습니까?비 다형 기본 클래스로 다운 캐스트하는 방법

+0

예 * 가능할 수도 있지만 'static_cast' 또는'reinterpret_cast'를 사용해야 할 수도 있습니다. * 그러나 *, 기본 클래스가 다형성이 아니며 가상 소멸자가없는 경우 아마도 상속받은 클래스가 올바른 선택이 아닙니다. 어쩌면 기본 클래스를 * 멤버 *로 사용해야할까요? 해결할 실제 문제는 무엇입니까? * 왜 * 당신은 상속을 사용합니까? –

+0

그래서, 기본 클래스가 비 다형성 (가상 메소드/소멸자 없음) 인 경우 다운 캐스트 할 수 없다고 말하는 것이 맞습니까? – Adrika

+0

'dynamic_cast'를 사용하면 불가능합니다. –

답변

1

가상 소멸자는 다운 캐스팅과 관련이 거의 없습니다. 소멸자를 가상으로 만드는 목표는 포인터를 기반으로 안전한 삭제를 허용하는 것입니다.

Base * ptr = new Derived; 
delete ptr; // undefined behavior if Base destructor isn't virtual 

Downcasting이 자신의 책임, static_cast을 사용하여 수행 할 수

void processBase(Base * ptr) 
{ 
    // undefined behavior if ptr does not point to Derived 
    // object or some object that inherits from Derived 
    Derived * derived = static_cast<Derived *>(ptr); 
} 

도 내리 뜬 법적 있는지 확인합니다 dynamic_cast있다, 그러나 그것은에 표현 점을 주조해야합니다 (또는 의미) 다형성 객체 (즉, 선언되거나 상속 된 하나 이상의 가상 함수가있는 객체). 주조 표현식의 타입 다형성 없으면

5.2.7.6 그렇지 않으면, V는 포인터 또는 다형성 형태 (10.3)

의 좌변한다 프로그램이 컴파일되지 것이다.

요약하면 destructor virtual을 사용하면 클래스를 다형성으로 만들지 만 다른 가상 멤버 함수를 선언하여도 마찬가지입니다. dynamic_cast을 사용하려면 다형성 유형이 필요합니다.

+0

non-polymorphic type의'dynamic_cast' 다운 캐스트가 잘못되었습니다. – Oktalist

+0

표준에서 문언을 이해하는 데 문제가 있음을 의미합니다. 그들은이 절에서 "v가 cv2 D에 대한 포인터를 가지고있다"는 것과이 절에서 지적 유형의 유형과 표현 유형을 구별하는 것이 중요하다는 것을 나는 요구 사항이 모든 유형의 지적자를 가리킨다 고 가정했다. 그러나 이상형은 비 다형성 표현 유형을 거부하므로 귀하가 옳습니다. –