본문 바로가기

c++ 언어/Effective C++

항목 7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자

include <iostream>


using namespace std;


class AWOV

{

public:

    AWOV() {

        cout<<"AWOV start"<<endl;

    }

    virtual ~AWOV() {

        cout<<"AWOV end"<<endl;

    }

};


class TEST : public AWOV

{

public:

    TEST() {

        cout<<"TEST start"<<endl;

    }

    virtual ~TEST() {

        cout<<"TEST end"<<endl;

    }

};


int main()

{

    AWOV *p = new TEST;

    delete(p);

    return 0;

}


TEST 클래스가 AWOV상속을 받고 있을 때  위의 코드처럼  AWOV 포인터로  TEST 클래스를  할당받을 시에  생성자 , 소멸자 호출관계에 대해서 알면된다.
결과는
AWOV start
TEST  start
TEST  end
AWOV end

생성자 호출 순서는  부모 -> 자식 
소멸자 호출 순서는  자식 -> 부모
이처럼 반대로 되어 있다
주의 해야하는 점은
상속관계에서  부모 클래스에서  소멸자를 virtual 선언하지 않으면 
AWOV start
TEST  start
AWOV end
이 처럼 자식 클래스의 소멸자가  호출되지 않는다.

주의할점은
부모클래스의 소멸자를  순수가상 함수로 만들면 에러가 난다.
그리고  소멸자가 가상함수로 되어 있지 않은 클래스를 상속 받으면 안되는 거다
대표적인게  책에서는  STL 컨테이너  다