본문 바로가기

컴퓨터 공학/C++, C

C++에서 소멸자에 virtual을 사용하는 이유는?

C++에서 소멸자에 virtual을 사용해야 하는 이유는 뭘까?

우선 ClassA를 부모 클래스, ClassB를 ClassA를 상속하는 자식클래스라고 할때

생성자와 소멸자는 다음과 같이 호출된다.

ClassB *B = new ClassB (A 생성자 -> B 생성자)

delete B (B 소멸자 -> A 소멸자)

그런데 만약 다형성 이용을 위해 ClassA 포인터에 자식 클래스 ClassB를 할당하면 어떻게 될까?

classA *A = new ClassB (A 생성자 -> B 생성자)

1. delete A (if ClassA destructor is virtual, B 소멸자 -> A 소멸자) 

2. delete A (if ClassA destructor is not virtual, A 소멸자) 

부모 클래스의 소멸자를 virtual로 선언하지 않으면 자식 클래스의 소멸자가 작동하지 않는다. 그 이유는 가상함수로 정의되지 않은 자식 클래스의 오버라이딩된 함수를 선언하면 부모 클래스의 멤버 함수가 호출되기 때문이다. 이와 같은 이유로 자식 클래스의 메모리 해제가 필요하다면 반드시 부모 클래스에 소멸자를 작성해야한다.

#include <iostream>

using namespace std;

class Base {
public:
	Base() {
		cout << "Base Constructor\n";
	}
	virtual ~Base() {
		cout << "Base Destructor\n";
	}
};

class Derived : public Base {
public:
	bool test = true;
	Derived() {
		cout << "Derived Constructor\n";
	}
	~Derived(){
		cout << "Derived Destructor\n";
	}
};
int main() {
	Derived *b = new Derived;
	Base *a = b;

	delete a;

	system("pause");
	return 0;
}

'컴퓨터 공학 > C++, C' 카테고리의 다른 글

C언어로 구현한 정렬 알고리즘  (0) 2019.04.01