가상 소멸자가 필요한 이유
2019. 11. 16. 14:30ㆍPL/C++
다형성에서 주로 거론이 된다. 주로 자식 클래스인 derived는 누구에게서 만들어졌는지 종종 모를 때가 많다. 따라서 base 클래스의 포인터를 선언해서 자식 클래스를 지정해서 삭제하는 경우가 대부분이다
#include <iostream>
using namespace std;
class Base {
public:
~Base() {
cout << "Base destructor\n";
}
};
class Derived : public Base {
private:
int *arr;
public:
Derived(int len) {
arr = new int[len];
}
~Derived() {
cout << "Derived destructor\n";
delete[] arr;
}
};
int main(void) {
Derived *d = new Derived(100);
Base *b = d;
delete b;
return 0;
}
Derived destructor가 먼저 호출되어야 하지만 엉뚱하게 Base destructor만 호출됨을 볼 수 있다. 이를 해결하기 위해서는 virtual키워드를 소멸자 앞에 붙여야만 한다
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base() {
cout << "Base destructor\n";
}
};
class Derived : public Base {
private:
int *arr;
public:
Derived(int len) {
arr = new int[len];
}
virtual ~Derived() {
cout << "Derived destructor\n";
delete[] arr;
}
};
int main(void) {
Derived *d = new Derived(100);
Base *b = d;
delete b;
return 0;
}
'PL > C++' 카테고리의 다른 글
friend 함수, 클래스 올바르게 사용하기 (0) | 2019.11.17 |
---|---|
new 연산자를 이용한 2차원 배열 할당 (0) | 2019.11.16 |
큐 연결리스트로 구현하기 (0) | 2019.11.15 |
포인터로 매개변수 넘겨서 메모리 할당 시 주의할 점 (0) | 2019.11.15 |
C++ 위임생성자 (0) | 2019.11.14 |