dynamic_cast 예제

dynamic_cast 예제

관리 코드에서 dynamic_cast 동작에 두 가지 주요 변경 사항이 있습니다. 따라서 메서드를 사용하기 전에 포인터가 프로그래머 개체를 가리키는지 확인해야합니다(). CLR 형식의 경우 dynamic_cast는 변환을 암시적으로 수행할 수 있는 경우 노-op또는 동적 검사를 수행하고 변환이 실패할 경우 nullptr을 반환하는 MSIL isinst 명령어를 생성합니다. 크로스 캐스트를 고려하면 포인터에서 D로 의 변환을 두 단계로 왼쪽에 있는 가장 A 하위 오브젝트로 변환할 수 있습니다. D에서 B로 크로스 캐스트를 수행한 다음 B에서 A로 암시적 변환을 수행할 수 있습니다. 예: dynamic_cast 연산자는 “크로스 캐스트”를 수행하는 데 사용할 수도 있습니다. 동일한 클래스 계층 구조를 사용하면 전체 개체가 E 형식인 경우 B 하위 오브젝트에서 D 하위 오브젝트로 포인터를 캐스팅할 수 있습니다. 이 예제에는 형식 Base포인터에서 파생된 형식의 지점까지 두 개의 동적 캐스트가 있습니다. 그러나 #1 성공적입니다.

예제에 포함시켰습니다. typeid 연산자는 type_info 헤더 파일에 정의된 클래스인 type_info 개체에 대한 참조를 반환합니다. pBDerived 및 pBBase는 형식 Base*의 포인터이지만 pBDerived는 파생 된 형식의 개체를 가리키고 pBBase는 형식 Base의 개체를 가리킵니다. 따라서 해당 형식 캐스팅을 dynamic_cast를 사용하여 수행할 때 pBDerived는 파생 클래스의 전체 개체를 가리키는 반면 pBBase는 파생 된 클래스의 불완전한 개체인 클래스 Base의 개체를 가리킵니다. “참조의 dynamic_cast가 실패하는 경우”를 의미했습니까? 또는 dynamic_cast와 static_cast 가 모두 std::bad_cast 형식의 예외를 throw하는 것입니까? 이 예제에서는 DoSomething(창* w)가 창 포인터아래로 전달됩니다. Scroll 개체에서만 사용할 수 있는 scroll() 메서드를 호출합니다. 따라서이 경우 개체가 scroll() 메서드를 호출하기 전에 스크롤 유형인지 여부를 확인해야합니다. rtti를 사용하지 않도록 설정하면 dynamic_cast를 일반적으로 사용해서는 안된다는 것을 간단히 지적 할 수 있습니다. 일반적으로 컴파일러가 컴파일타임에 올바르게 추측된 경우 100% 예외 또는 캐스팅이 발생하며, 그렇지 않으면 정의되지 않은 것처럼 보입니다(이 경우 경고할 수도 있고 경고하지 않을 수도 있음). dynamic_cast는 type-id가 값 형식에 대한 내부 포인터인 경우 더 이상 예외를 throw하지 않으며 캐스트는 런타임에 실패합니다. 이제 캐스트가 throw하는 대신 0 포인터 값을 반환합니다.

이러한 변환이 구성또는 변동성을 없애는 경우를 제외하고 dynamic_cast를 사용하면 다음 변환만 수행할 수 있습니다. 동적 캐스트의 소멸자 예제 코드를 사용하지 않으면 컴파일되지 않습니다. 이유를 설명하십시오. 사전에 감사합니다. 예. 참조와 함께 dynamic_cast를 사용할 수 있으며 실패하면 std::bad_cast 형식의 예외가 throw됩니다. 나는 공과에 그렇게하는 방법의 예를 추가했다. 안녕하세요, 저자, 동적 캐스트를 사용하는 좋은 예가 있습니다.

레이캐스트를 수행해야 하는 게임을 작성할 때 플레이어 앞의 게임 오브젝트가 상호 작용할 수 있는 개체인지 확인합니다. 실패하면 상호 작용할 수 없는 일반 게임 오브젝트이며 아무 일도 일어나지 않습니다.

Comments are closed.

    About

    This is the deafult sidebar, add some widgets to change it.