fullstack

'virtual 소멸자'에 해당되는 글 1건

  1. [C++] virtual 소멸자

[C++] virtual 소멸자

Language/C++

이전 글인 [C++] virtual 키워드 에서 virtual 키워드로 가상함수를 만든다는 것을 알았다.

하지만 virtual 키워드를 붙여 주어야 할 대상은 가상함수 뿐만이 아니다. 소멸자 앞에 virtual 키워드를 붙인 것을 virtual 소멸자라 한다.

그럼 virtual 소멸자는 왜 써야할까? 다음 예제를 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
class AAA
{
public:
    AAA() { cout << "AAA()" << endl; }
    ~AAA() { cout << "~AAA()" << endl; }
};
 
class BBB : public AAA
{
public:
    BBB() { cout << "BBB()" << endl; }
    ~BBB() { cout << "~BBB()" << endl; }
};
 
int main()
{
    AAA* b = new BBB;
 
    delete b;
 
    return 0;
}




위의 예제를 보면 AAA 타입의 포인터로 BBB 객체를 생성하였다. 그리고 해당 객체를 소멸하자 AAA 클래스의 소멸자만 호출이 되었다.

이는 소멸할 객체는 BBB 객체이지만 AAA 타입의 포인터로 가리키고 있기 때문에, 컴파일러는 AAA 객체로 인식한 것이다.


이를 해결하기 위해서 다음과 같이 Base 클래스의 소멸자에 virtual 키워드를 붙여주면 모든 소멸자가 올바르게 출력되는 것을 볼 수 있다.


1
virtual ~AAA() { cout << "~AAA()" << endl; }



이렇게 하면 Base 클래스의 소멸자를 호출하려다 virtual 인 것을 보고, Derived 클래스의 소멸자를 호출하게 된다.

그 다음으로 BBB 클래스의 소멸자는 AAA 클래스를 상속하고 있기 때문에 다시 AAA 클래스이 소멸자가 호출되게 된다.


'Language > C++' 카테고리의 다른 글

[C++] 연산자 오버로딩  (0) 2016.01.04
[C++] 다중 상속  (1) 2015.12.28
[C++] 순수 가상 함수와 추상 클래스  (0) 2015.12.26
[C++] static binding & dynamic binding  (0) 2015.12.26
[C++] virtual 키워드  (0) 2015.12.24