상속관계에 있는 포인터의 경우 static_cast로 형변환이 가능합니다.
다만, 이경우 class A {..}; class B : public A {...}; class C : public A {...}; 와같은 클래스들이 있을때 A *a = new B;에 대해서
C *c = dynamic_cast<C*>(a)는 널 포인터를 반환하지만, static_cast<C*>(a)는 아무런 검사도 하지 않고 형변환을 하기 때문에, 실제론 잘못동작할수 있는 코드가 아무런 경고나 에러없이 컴파일되게 됩니다.
그렇다고 무조건 dynamic_cast를 쓰면 좋은 것도 아닙니다. RTTI를 이용해서 런타임시에 형을 체크하기 때문에, 잦은 dynamic_cast는 눈에 띌 정도의 퍼포먼스 저하의 원인이 될수 있습니다.
그렇기 때문에, 형이 A*인 a를 C*로 형변환할때, 논리적으로 생각해서 a가 C*로 형변환되는 것이 안전하다고 생각할때만 static_cast를 이용하고, 확신할수 없을 경우는 dynamic_cast를 이용하여 널포인터를 체크하는 것이 바람직하다고 생각합니다.
상속관계에 있는
상속관계에 있는 포인터의 경우 static_cast로 형변환이 가능합니다.
다만, 이경우 class A {..}; class B : public A {...}; class C : public A {...}; 와같은 클래스들이 있을때 A *a = new B;에 대해서
C *c = dynamic_cast<C*>(a)는 널 포인터를 반환하지만, static_cast<C*>(a)는 아무런 검사도 하지 않고 형변환을 하기 때문에, 실제론 잘못동작할수 있는 코드가 아무런 경고나 에러없이 컴파일되게 됩니다.
그렇다고 무조건 dynamic_cast를 쓰면 좋은 것도 아닙니다. RTTI를 이용해서 런타임시에 형을 체크하기 때문에, 잦은 dynamic_cast는 눈에 띌 정도의 퍼포먼스 저하의 원인이 될수 있습니다.
그렇기 때문에, 형이 A*인 a를 C*로 형변환할때, 논리적으로 생각해서 a가 C*로 형변환되는 것이 안전하다고 생각할때만 static_cast를 이용하고, 확신할수 없을 경우는 dynamic_cast를 이용하여 널포인터를 체크하는 것이 바람직하다고 생각합니다.
감사합니다!
감사합니다 이해가 되었습니다!
http://www.ikpil.com
댓글 달기