프로그래밍/Effective c++

27. 캐스팅은 절약, 또 절약! 잊지 말자

CuriousBear 2016. 3. 10. 16:38
c++에는 다음과 같은 캐스팅 방식이 있다.

c언어 스타일의 캐스팅을 쓰려거든 반드시 c++ 방식을 쓰자.

하지만 캐스팅은 내부 동작이 어떻게 일어날지 예상하기 힘드므로 최대한 안쓰는 다음 세가지 정도의 방향으로 설계를 하는 것이 좋다.
1. B가 A를 상속한다고 할 때, B에서 A에서 상속받은 함수를 재정의 할때,  A의 함수를 먼저 호출 해야하는 경우가 있다.
이때 다음과 같이 억지로 타입캐스팅을 하지 말고
virtual void B::onResize () {
     static_ cast<A> ( * this) . onResize (); --> 이렇게 쓰는 신기한놈도 있나... 생각도 못했네;;
}
그냥 다음처럼 쓰면 된다.
virtual void B::onResize () {
    A::onResize ();
}

2. B가 A를 상속할 때,  B의 함수를 쓸거라면 굳이 자료구조를 다음과 같이 A 컨테이너로 만들지 말고
std::vector<std::tr1::shared_ptr<A>>  VPW ;
for (VPW:: iterator iter = winPtrs.begin() ;  iter ! = winPtrs . end(); ++iter) {
if (SpecialWindow *psw = dynamic’_ C'dsL(iter->get()) ) 
      psw->b1ink() ;
}

, B 컨테이너로 만들어서
다음과 같이 쓴다.

std::vector<std::tr1::shared_ptr<B>>  VPW ;
for (VPW:: iterator iter = winPtrs.begin() ;  iter ! = winPtrs . end(); ++iter) {
(*iter)->blink() ;
}

3. 다형성을 이용해 2번의 문제를 가상함수로 푼다. A에서 blink()를 가상함수로 만들어준다.



그냥 닥치고 상속관계를 잘 설계하자.

그럼 망할 캐스팅 생각할필요도 없겠지...