티스토리 뷰
갑자기 궁금해진 것이 있었다.
A 클래스에 virtual release() 함수를 만들고 그 안에서 delete this를 한다.
그리고 B 클래스에서 A 클래스를 상속 받고 release() 함수를 오버라이딩 하지 않는다.
그 다음 B 클래스의 객체로 release() 함수를 호출하면
과연 B 클래스를 전체를 지울 것인가(A 포함), B 클래스의 A 클래스 부분만 지울 것인가가 헷갈렸다.
본능적으로 당연히 전자가 답이라고 생각이 들었지만 확실한지 궁금해졌다.
디버거를 돌려보면 알 수 있는데 결론적으로 B의 객체 cb에서 release()를 호출하면 B 전체가 delete 된다.
확실하진 않으나 A 클래스에서 release() 함수가 virtual이기 때문에 자식 클래스에 함수 자체가 그대로 복사가 되어서
결국엔 delete this(B)가 되는 것이 아닌가 싶다.
A 클래스에 virtual release() 함수를 만들고 그 안에서 delete this를 한다.
그리고 B 클래스에서 A 클래스를 상속 받고 release() 함수를 오버라이딩 하지 않는다.
그 다음 B 클래스의 객체로 release() 함수를 호출하면
과연 B 클래스를 전체를 지울 것인가(A 포함), B 클래스의 A 클래스 부분만 지울 것인가가 헷갈렸다.
본능적으로 당연히 전자가 답이라고 생각이 들었지만 확실한지 궁금해졌다.
#include <stdio.h>
class A
{
char *a;
public:
A() { a = new char[10]; };
virtual ~A() { delete []a; };
void release()
{
if( true )
delete this;
}
void Print()
{
printf("%s\n", a);
};
};
class B : public A
{
char *b;
public:
B() { b = new char[20]; };
virtual ~B() { delete []b; };
virtual void Print()
{
A::Print();
printf("%s\n", b);
};
};
void main()
{
A * ca = new A;
B * cb = new B;
ca->Print();
ca->release();
cb->Print();
cb->release();
}
디버거를 돌려보면 알 수 있는데 결론적으로 B의 객체 cb에서 release()를 호출하면 B 전체가 delete 된다.
확실하진 않으나 A 클래스에서 release() 함수가 virtual이기 때문에 자식 클래스에 함수 자체가 그대로 복사가 되어서
결국엔 delete this(B)가 되는 것이 아닌가 싶다.
'프로그래밍 > 잡탕' 카테고리의 다른 글
[Lua] 객체지향 프로그래밍 튜토리얼(Object Orientation Tutorial) (0) | 2012.01.22 |
---|---|
[Lua] require, module(..., pakage.seeall) (0) | 2012.01.22 |
Social Software System (0) | 2011.07.06 |
%의 옵션 (0) | 2011.05.14 |
윈도우 스타일(WS) (0) | 2011.03.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday