클래스 소멸자를 가상함수로 만드시면 되는 것으로 알고 있습니다.
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가 뭔지 찾아야 하는 어려움 때문에.. 불편하네요..
:
: 감사합니다.
:
:
|