2009-08-10 3 views

답변

29

기본 클래스 유형에서 파생 클래스 유형으로 캐스팅 할 때 dynamic_cast을 사용하십시오. 캐스트되는 객체가 실제로 파생 클래스 유형인지 확인하고 객체가 원하는 유형이 아닌 경우 null 포인터를 반환합니다 (참조 유형으로 캐스팅하지 않은 경우) - bad_cast 예외가 발생합니다.

이 추가 검사가 필요하지 않은 경우 static_cast을 사용하십시오. Arkaitz가 말했듯이, dynamic_cast은 여분의 검사를 수행하기 때문에 RTT 정보가 필요하므로 런타임 오버 헤드가 더 커지지만 static_cast은 컴파일 타임에 수행됩니다.

+2

동적 캐스트는 참조를 캐스팅하는 데에도 사용할 수 있습니다.이 경우 null 점을 반환하지 않고 캐스팅 오류에 대한 예외가 발생합니다. –

+0

dynamic_cast는 런타임에 예외를 throw 할 수도 있습니다. –

+0

@Neil, Martin : 감사합니다. 내 대답을 편집했습니다. –

2

동적 캐스팅은 RTTI가 필요하며 정적 캐스팅에 비해 약간의 마법을 필요로합니다. static_cast는 컴파일 타임 캐스트 일 뿐이며, 원천 클래스가 상속으로 간단한 규칙에 의해 캐스트 된 클래스로 승격 될 수 있는지 확인합니다.

예를 들어 가상 상속의 경우 dynamic_cast 만 상황을 해결할 수 있습니다.

캐스트가 불가능한 경우 dynamic_cast는 NULL을 반환하므로 다른 결정을 내릴 수 있습니다.

반면에 dynamic_cast는 실행되는 코드를 의미하기 때문에 속도가 느립니다. 이전에 말했듯이 RTTI를 사용하면 바이너리 크기가 커질 수 있습니다.

+0

dynamic_cast는 런타임시 예외를 throw 할 수 있습니다. –

0

C++에 대해 이야기하고 있다면. 그런 다음 static_cast는 안전한 캐스팅 유형이 아닙니다. 그것은 당신의 타입으로 캐스팅 할 수 있지만 오류가 있으면 에러/메시지를 던지지 않습니다. 그래서 당신은 그것으로부터 나쁜 대상을 얻을 것입니다. 그리고 캐스팅이 실패하면 dynamic_cast가 오류를 던지고 있습니다 :) 희망이 도움이됩니다! :)

3

dynamic_cast RTTI와 같이 런타임에 사용 가능한 정보를 확인하고 클래스 계층 구조를 탐색하여 이러한 캐스트가 가능한지 확인합니다.

확인 C++ type casting tutorial at cplusplus.com

2

static_cast는 기존의 C 스타일 캐스트와 유사하며 아무것도 막에 적용 할 수 있습니다. static_cast은 문제의 유형이 확실 할 때 사용됩니다. 예를 들어 intenum 사이에서 전송할 때는 보통 static_cast을 사용합니다.

dynamic_cast은 포인터와 참조에서만 사용할 수 있습니다. 캐스트에 실패하면 널 포인터가 리턴됩니다. dynamic_cast은 일반적으로 상속에서 사용되는 클래스에 대한 포인터를 해석 할 때 사용됩니다. 여기서 상속에서 포인터가 예상되는 유형인지 확인해야합니다.

또한 C++ : Documentation : C++ Language Tutorial : Type Casting

+2

static_cast에 대한 이야기는 실제로 reinterpret_cast에 대해 더 정확하게 말한 것입니다. –

+0

나는 anon에 동의하고, reintepret_cast는 C 스타일 캐스트와 비슷합니다. – Aminos

2

정적 캐스팅은 컴파일러에 의해 이루어집니다 확인하지 : 그것은 대상 유형으로 결과를 처리, 상관없이. 타겟 형식의 인수에 대해 절대적으로 확신 할 때 이렇게합니다.

동적 캐스팅은 런타임에 수행되므로 런타임 유형 정보가 필요합니다.당신은 당신이 가지고있는 타입에 대해 확신 할 수 없을 때 이것을 수행한다. 반환 값이 null 인 것으로 보여지는 캐스트가 실패 할 수도있다. 또한 포인터와 참조에 대해서만 수행 할 수 있습니다.

7

이 컨텍스트에서는 "정적"은 컴파일 타임을 나타내고 "동적"은 런타임을 참조합니다.

컴파일 타임 검사의 경우 static_cast를 사용하십시오 (컴파일러가 알고있는 것에 한정됨). 런타임 검사에는 dynamic_cast (RTTI가있는 클래스로 제한)를 사용하십시오. 점검하지 않으려면 reinterpret_cast를 사용하십시오.