C++의 4가지 캐스팅 연산자에 대해 정리하고 넘어가자.
(static_cast, dynamic_cast, const_cast, reinterpret_cast)
1. static_cast와 dynamic_cast
컴파일 시 static_cast 검사를 통해 두 형식 간에 상속 관계가 있는지 여부를 확이한다. 상속관계가 없을 시 컴파일 오류가 난다. 하지만 런타임 검사가 시행되지 않아 다운캐스팅 하였을 경우 액세스 위반이 발생 할 수 있다. 이 상황에서도 컴파일 오류는 나타나지 않는다. 그러나 dynamic_cast는 다운캐스팅시에 사용하는 캐스팅으로 변환이 가능한지에 대한 확인작업을 먼저 하여 위반시 컴파일 오류를 나타냅으로써 안전한 다운캐스트가 가능하게 한다. 아래의 코드에서 dynamic_cast와의 차이점을 볼 수 있다.
pd1인 경우는 B 클래스 안에 없는 함수들이 있기때문에 캐스팅이 불가능하다는 컴파일 오류는 나게 한다. 하지만 pd2인 경우는 컴파일 오류는 나지 않으나 런타임시 pd2에서 sub나 mul 사용에 대한 액세스 위반이 발생할 수 있다.
2. const_cast
const_cast는 const 속성을 제거할 때 사용한다.
msdn의 예제를 보니 const 변수는 많이 다뤄보았으나 const 함수는 많이 활용해보지 않았다.
printNumber함수가 const로 지정이 되어있습니다. 여기서 함수 선언시 사용되는 const는 멤버 함수에만 사용이 가능하며 목적은 멤버 변수의 변경을 방지 하기 위함입니다. 그렇다면 아래와 같이 printNumber 함수에서는 number 변수의 변경이 원래는 불가합니다. 그러나 const_cast를 통하여 const 속성을 없애고 변경을 하는것을 볼 수 있습니다.
3. reinterpret_cast
무조건적인 형변환으로 실제 데이터가 어떤 객체이던 강제로 형변환을 진행하여 상당히 위험한 캐스팅이다. 편하긴 한데 위험한....일단 나는 함수 포인터를 pvoid로 변환한다던가 IUnknown 같은 인터페이스를 추출할때 사용한다.
다중상속시는 기존클래스와의 인스턴스 포인트가 달라서 주의를 해야한다.
댓글 없음:
댓글 쓰기