class TA
{
public:
UnicodeString m_Msg;
public:
TA() { ShowMessage("TA Constructor"); };
virtual ~TA() {};
virtual void Message() = 0;
virtual void Message(UnicodeString sMsg) = 0;
};
이렇게 하니 되네요.
delete p; // ~TB() => ~TA() 이렇게 호출되네요.
p = new TB(); // TA() => TB() 이렇게 호출되네요.
혹시 도움될 것 같아서 풀 텍스트 올립니다.
Class 선언부 는 이렇게..
class TA
{
public:
UnicodeString m_Msg;
public:
TA() { ShowMessage("TA Constructor"); };
virtual ~TA() { ShowMessage("TA Destructor"); };
virtual void Message() = 0;
virtual void Message(UnicodeString sMsg) = 0;
};
class TB : public TA
{
public:
TB() { ShowMessage("TB Constructor"); }
~TB() { ShowMessage("TB Destructor"); }
void Message() { ShowMessage("TB message"); }
void Message(UnicodeString sMsg) { ShowMessage(sMsg); }
};
class TC : public TA
{
public:
TC() { ShowMessage("TC Constructor"); }
~TC() { ShowMessage("TC Destructor"); }
void Message() { ShowMessage("TC message"); }
void Message(UnicodeString sMsg) { ShowMessage(sMsg); }
};
사용은 아래와 같이..
TA *p = new TB(); // TA() => TB() 순으로 호출
..
p->m_Msg = "abcd";
..
delete p; // ~TB() => ~TA() 순으로 호출
..
p = new TC();
..
p->m_Msg = "abcd";
..
delete p;
주누 님이 쓰신 글 :
: 클래스 소멸자를 가상함수로 만드시면 되는 것으로 알고 있습니다.
:
: virtual ~TA();
:
: 땅주인 님이 쓰신 글 :
: : TB, TC 클래스는 TA 추상 클래스를 상속 받아서 처리하였습니다.
: :
: : TA *p = new TB() or new TC() 로 상황에 따라 객체를 생성하여 처리하였는데,
: : 객체의 소멸 delete p 하면 TA의 소멸자가 호출되어 버리네요. 상속된 클래스에서 자체적으로
: : 사용한 Resource가 있는데, 상위 객체의 소멸자를 호출해서 다른 Resource를 해제하지 못하는
: : 상황이 발생하는데.. 그냥 down_cast 연산으로 해야 하나요?
: :
: :
: : class TA
: : {
: : public:
: : UnicodeString m_Msg;
: : public:
: : TA() {ShowMessage("TA Constructor");};
: : ~TA() {ShowMessage("TA Destructor");};
: : virtual void Message(UnicodeString sMsg) = 0;
: : };
: :
: : class TB : public TA
: : {
: : public:
: : TB() { ShowMessage("TB Constructor"); }
: : ~TB() { ShowMessage("TB Destructor"); }
: : void Message(UnicodeString sMsg) { ShowMessage(sMsg); }
: : };
: :
: : class TC : public TA
: : {
: : public:
: : TC() { ShowMessage("TC Constructor"); }
: : ~TC() { ShowMessage("TC Destructor"); }
: : void Message(UnicodeString sMsg) { ShowMessage(sMsg); }
: : };
: :
: :
: : 이들 클래스에 대한 객체 생성 및 사용된 코드..
: :
: :
: : TA *p = new TB(); // 순서대로 TA(), TB() 호출됨
: : ..
: : p->m_Msg = "abcd";
: : ..
: : delete (TB *)p; // ~TB() 호출됨, delete p; 하면 ~TA() 호출됨
: : ..
: : p = new TC(); // 순서대로 TA(), TC() 호출됨
: : ..
: : p->m_Msg = "abcd";
: : ..
: : delete (TC *) p; // ~TC() 호출됨. delete p하면 ~TA()호출됨.
: :
: :
: : delete p 하면 알아서 상속받은 클래스의 파괴자를 호출할 수는 없나요?
: : 반드시 type cast를 해줘야 하는 지? 소거할 때마다 하부 class가 뭔지 찾아야 하는 어려움 때문에.. 불편하네요..
: :
: : 감사합니다.
: :
: :