rein's world

최근 저지른 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건 저 형변환은 안전하게 일어난다.

일하던 중에 저 메시지를 보고는 이게 뭔 소리야 하고 코드를 한참 뒤지다가, 상속 한정자를 붙이지 않았다는걸 발견하고 대좌절