내 소멸자 가상을 만들지 않고 C++에서 비 다형성 기본 클래스의 포인터/참조를 다운 캐스트 할 수 있습니까?비 다형 기본 클래스로 다운 캐스트하는 방법
답변
가상 소멸자는 다운 캐스팅과 관련이 거의 없습니다. 소멸자를 가상으로 만드는 목표는 포인터를 기반으로 안전한 삭제를 허용하는 것입니다.
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
을 사용하려면 다형성 유형이 필요합니다.
non-polymorphic type의'dynamic_cast' 다운 캐스트가 잘못되었습니다. – Oktalist
표준에서 문언을 이해하는 데 문제가 있음을 의미합니다. 그들은이 절에서 "v가 cv2 D에 대한 포인터를 가지고있다"는 것과이 절에서 지적 유형의 유형과 표현 유형을 구별하는 것이 중요하다는 것을 나는 요구 사항이 모든 유형의 지적자를 가리킨다 고 가정했다. 그러나 이상형은 비 다형성 표현 유형을 거부하므로 귀하가 옳습니다. –
- 1. 비 다형성 가상 기본 클래스에서 다운 캐스트하는 방법은 무엇입니까?
- 2. Convert.ChangeType을 사용하여 특정 클래스로 캐스트하는 방법은 무엇입니까?
- 3. C++에서 제대로 다운 캐스트하는 방법
- 4. 기본 다형 레일 양식
- 5. 추가 멤버가있는 파생 클래스의 다형 다운 캐스팅
- 6. 기본 클래스를 지정하지 않고 파생 클래스를 기본 클래스로 다시 캐스트하는 불가지론적인 방법이 있습니까?
- 7. shared_ptr의 non-const 참조를 기본 클래스로 캐스트하는 더 안전하고 안전한 방법이 있습니까?
- 8. 일반 콜렉션으로 캐스트하는 방법
- 9. 레일 다형 모델 - 기본 클래스
- 10. GWT AutoBean을 다운 캐스트하는 방법이 있습니까?
- 11. AnyObject에서 UInt16으로 다운 캐스트하는 방법은 무엇입니까?
- 12. GSON 던지기 예외가있는 다형 JSON을 비 직렬화
- 13. Simple XML을 사용하여 다형 클래스를 비 직렬화하기
- 14. UWP XmlSerializer - 파생 클래스에서 기본 클래스로 개체의 비 직렬화
- 15. BindingSource를 DataTable에 캐스트하는 방법?
- 16. 문자열을 HttpFilePostedBase에 캐스트하는 방법
- 17. GSON을 사용하여 캐스트하는 방법
- 18. 에서 MySQL을위한 캐스트하는 방법()
- 19. 기본 유형 다운 캐스트
- 20. 다형 멤버 함수 포인터
- 21. xml의 일부를 클래스로 비 병렬화
- 22. 저지를 서브 클래스로 비 직렬화하십시오.
- 23. protobuf-net 기본 클래스로 직렬화
- 24. 파생 클래스 인스턴스를 포인터에서 다형 기본 클래스로 복사/작성하는 방법은 무엇입니까?
- 25. unique_ptr을 기본 클래스로
- 26. 가변 기본 클래스로 스왑하기
- 27. 기본 생성자가없는 클래스로 캐스팅
- 28. C++ 기본 클래스로 캐스트
- 29. 특정 메시지를 브로드 캐스트하는 방법
- 30. mp4 스트림을 브로드 캐스트하는 방법
예 * 가능할 수도 있지만 'static_cast' 또는'reinterpret_cast'를 사용해야 할 수도 있습니다. * 그러나 *, 기본 클래스가 다형성이 아니며 가상 소멸자가없는 경우 아마도 상속받은 클래스가 올바른 선택이 아닙니다. 어쩌면 기본 클래스를 * 멤버 *로 사용해야할까요? 해결할 실제 문제는 무엇입니까? * 왜 * 당신은 상속을 사용합니까? –
그래서, 기본 클래스가 비 다형성 (가상 메소드/소멸자 없음) 인 경우 다운 캐스트 할 수 없다고 말하는 것이 맞습니까? – Adrika
'dynamic_cast'를 사용하면 불가능합니다. –