C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[10433] 소멸자에서 가상함수 호출하면...
김상구.패패루 [peperu] 1617 읽음    2005-03-23 17:52
안된다는걸 오늘 처음 알았습니다. ㅠ ㅠ
C++ Builder에서는 TObject를 상속받았을 경우 소멸자에서 가상함수를 호출해도 상관 없습니다.
다행스럽게도 그동안 RTTI정보를 이용하느라 대부분의 클래스를 TObject를 상속받아서 만들었기 때문에 기존 소스를 수정하는 난리는 치지 않아도 되겠지만... 이런걸 이제서야 알다니...

아주 간단한 예제입니다.
class TParent
{
public:
  TParent() {}
  virtual ~TParent() {
    printf("~TParent called\r\n");
    Close();
  }
  virtual void __fastcall Close() {
    printf("TParent::Close() called\r\n");
  }
};

class TChild : public TParent
{
public:
  TChild() : TParent() {}
  virtual ~TChild()  {
    printf("~TChild called\r\n");
  }
  virtual void __fastcall Close()  {
    printf("TChild::Close() called\r\n");
  }
};

main()
{
  TParent *a  = (TParent*)new TChild();
  delete a;
}

결과는 직접 해 보시면 아시겠지만 TChild객체인 a가 파괴될 때 TChild::Close()가 아닌 TParent::Close()가 호출이 됩니다. Close()를 순수 가상함수로 선언했을 경우엔 걍 뻗습니다. 쭈욱~~~
VC++에서도 마찬가지입니다(6.0, 2003).
대충 파악하기론... TParent의 소멸자보다 TChild의 소멸자가 먼저 실행되면서 vtable이 변경되는게 문제인 듯 합니다.
만약 TParent를 TObject를 상속받게 만들면 TChild::Close()가 제대로 호출됩니다. TObject관련 도움말에도 약간의 힌트가 될만한 글이 적혀 있더군요.
혹시나 VC++에서도 CObject를 상속받으면 되나 싶어서 해 봤는데 역시 안되더군요.
그나저나 소멸자에서 가상함수를 안쓰는 방향으로 하려고하니... 제가 지금 만들고 있는 프로그램에선 무지 불편하네요. 에효...

모르고 계셨던 분이 혹시 계실까 싶어서 끄적여봅니다.
비밀 [roseria]   2005-03-24 10:22 X
VS .NET 2003에서는 오류없이 실행이 되더군요. 뭔가 구현이 다른걸까요
( __fastcall 은 삭제했습니다만 )
김상구.패패루 [peperu]   2005-03-24 11:09 X
저도 VS.NET 2003에서 테스트 해 본건데... -_-a 시간나면 다시 한 번 체크해 봐야겠네요
서정국.새더 [mmouse]   2005-03-24 15:13 X
.net 2003 에서도 정상작동 하지 않습니다. 예상되는 동작은 TChild 의 Close 펑션 호출인데 TPanel 의 Close 가 호출 되죠.. 그리고 TPanel 의 Close 가 순수 가상함수 인 경우에는 여지없이 링킹에러 납니당 -ㅁ-..
Jacky [sykim25]   2005-04-01 20:09 X
제가 알기로는(C++ 기초 플러스)
TParent 클래스의 소멸자는 상속 받는 경우에 반드시 virtual 로 해주어야하고
반드시 정의가 포함되어야 한다는(순수 가상 소멸 X) 것으로 알고 있습니다.
차일드의 소멸시에 상속의 부모 클래스 소멸자는 자동 호출되어서 그런 걸로 알고 있습니다
지금 정신이 없어서 두서 없이 적어봤습니다.. -_-;;

+ -

관련 글 리스트
10433 소멸자에서 가상함수 호출하면... 김상구.패패루 1617 2005/03/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.