카테고리 없음

가상 소멸자 (연좌제 소멸)

zuyo 2019. 5. 9. 01:56
반응형

C++ 컴파일러는 포인터의 자료형을 기준으로 판단하기 때문에, 소멸자 호출 시 해당 자료형 클래스의 소멸자만 호출된다. 

예를 들어, Parent* parent = new Child(); 로 선언한 객체를 소멸하면 Parent의 소멸자만 호출되고, Child의 나머지 부분은 메모리에 계속 남게 된다.

상속 관계를 갖는 객체 소멸 과정에서는 자료형에 상관없이 모든 소멸자가 호출되어야 한다.


가상 소멸자

상속 계층의 맨 위에 존재하는 부모 클래스의 소멸자를 virtual로 정의하면 이를 상속하는 자식 클래스의 소멸자들도 모두 '가상 소멸자'로 선언된다.

가상 소멸자가 호출되면, 상속의 계층 구조상 맨 아래에 존재하는 자식 클래스의 소멸자가 대신 호출되면서 부모 클래스의 소멸자까지 순차적으로 호출된다.

virtual ~Parent() {
        delete []var;
}

밑의 예시에선 가상 소멸자를 어떻게 사용하는지를 보여준다. 

가상 소멸자를 선언하지 않았다면 자료형 Life에 따라서 ~Life()만 출력 되었을테지만, 부모 클래스인 Life에 가상 소멸자를 선언했기 때문에 ~Animal()과 ~Life()가 둘 다 출력된다.

#include <iostream>
using namespace std;

class Life {
private:
	char* strOne;

public:
	Life(char * str) {
		strOne = new char[strlen(str)+1];
	}

	virtual ~Life() {
                cout << "~Life()" << endl;
		delete []strOne;
	}
};

class Animal : public Life {
private:
	char* strTwo;

public:
	Animal(char* str1, char*  str2) : Life(str1) {
		strTwo = new char[strlen(str2)+1];
	}

	~Animal() {
                cout << "~Animal()" << endl;
		delete []strTwo;
	}
};

void main() {
	Life* life =  new Animal("생물","동물");
	delete life;
}

 

반응형