최근 저지른 C++ 타입 변환 삽질

회사생활을 하면서 각 프로그래밍언어들 중 가장 많이 사용하고 있는 것이 대충 C++, python, lua, MS-DOS batch 파일 정도 되는 것 같다. 그러다 보니 이런 삽질도 한다.

// inheritance : C++
class impl : abst // abstrct base class abst.
{
// blah, blah, blah ...
};

// blah, blah, blah, ...
abst* x = dynamic_cast< abst* >( &impl_type_var );

사실 이 코드를 보면 위화감을 느껴야 한다.
컴파일해보면 VS2005에서는 “컴파일은 되는거지만 무조건 런타임 에러다!” 라고 warning이 뜬다. GCC 4.1에서는 명시적으로 에러라고 알려준다.

그러나 최근 python을 주로 쓰다보니, 파이썬 상속 코드 처럼 작성했던 것. 파이썬으로 상속하면 다음처럼 짜게된다.

# inheritance : python
class impl (  abst_package.abst ):
# blah, blah, blah, ...

C++ class를 상속받을 때 public, protected, private 중에 고르지 않으면 (자동적으로) private이 선택된다. (struct는 public이긴하지만 -_-; ) 그래서 impl -> abst 타입으로의 형 변환이 허용되지 않는 것.

만약 class impl이 아니라 struct impl이면 abst가 class건 struct건 저 형변환은 안전하게 일어난다.

뭐 그런 것이다 Orz
일하던 중에 저 메시지를 보고는 이게 뭔 소리야 하고 코드를 한참 뒤지다가(…), 상속 한정자를 붙이지 않았다는걸 발견하고 대좌절 o <-<

앞으로 이런 삽질 하지 말아야할텐데 흑흑

Published by

rein

나는 ...

5 thoughts on “최근 저지른 C++ 타입 변환 삽질”

  1. 찾았다기보단 뭔 소린가 고민하다 발견했다고 해야하나

    컴파일 타임에 찾았다기엔 좀 거리가[…]

  2. 생각해 보니 private 상속은 interface를 상속 받는 것이 아니라 implementation을 상속 받는 것이니 type casting이 안되는 것이 당연한 것이겠네요. 좋은 정보 알았습니다.

Leave a Reply