#include <iostream>
using namespace std;
class classA
{
public:
classA();
~classA();
};
class classB : public classA
{
public:
classB();
~classB();
};
classA::classA()
{
cout << "A" << endl;
}
classA::~classA()
{
cout << "~A" << endl;
}
classB::classB()
{
cout << "B"<< endl;
}
classB::~classB()
{
cout << "~B" << endl;
}
int main()
{
cout << "START" << endl;
classB *B = new classB;
classA *A = B;
delete A;
return 0;
}

classA 소멸자에 virtual을 사용해서
START A B ~B ~A : 부모소멸자가 먼저 실행되고 자식 소멸자가 실행된다.



상속을 받은 클래스의 생성과 소멸 과정을 본경우 생성과정의 경우 부모클래스의 생성자함수가 먼저 실행되는 경우를 볼수가 있다 하지만 소멸과정의 경우 자식클래스의 소멸함수가 먼저 실행되고 부모클래스의 소멸과정이 실행된다 그런데 다형성 이용을 위해 부모클래스 포인터로 부터 자식 클래스를 호출할떄 가상함수로 정의되지 않은 자식 클래스의 오버라이딩이 된 함수를 호출하면 부모클래스의 멤버 함수가 호출이 되고 소멸자 자식 클래스에서 오버라이딩된 함수라고 볼 수 있기 떄문에 만약 부모포인터로 부터 객체를 삭제하면 부모 클래스의 소멸자가 실행이 되어 자식클래스의 소멸자가 실행 되지 않는다.
 
하지만 Virtual를 사용 되었다면 이것은 자식클래스에서의 재정의 될 수 있음을 명시하기 떄문에 포인터의 종류에 상관없이 항상 자식 클래스의 메소드가 실행된다 . 결과적으로 자식클래스의 소멸자가 호출되고 부모 클래스의 소멸자가 호출된다.












공감로그인을 필요로 하지않습니다.


공감





+ 최근 게시물