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 |
---|