상속을 할때 소멸자에 virtual을 붙여줘야 함
부모클래스로 선언하고 자식클래스로 동적할당했을 때 소멸 시 자식 소멸자가 호출 안 됨
virtual을 붙이지 않은 경우
#include "pch.h"
#include <iostream>
class A {
public:
A();
~A();
};
class B : public A {
public:
B();
~B();
};
A::A()
{
std::cout << "A()" << std::endl;
}
A::~A()
{
std::cout << "~A()" << std::endl;
}
B::B()
{
std::cout << "B()" << std::endl;
}
B::~B()
{
std::cout << "~B()" << std::endl;
}
int main()
{
A *b = new B();
delete b;
}
결과
virtual을 붙여준 경우
#include "pch.h"
#include <iostream>
class A {
public:
A();
virtual ~A();
};
class B : public A {
public:
B();
~B();
};
A::A()
{
std::cout << "A()" << std::endl;
}
A::~A()
{
std::cout << "~A()" << std::endl;
}
B::B()
{
std::cout << "B()" << std::endl;
}
B::~B()
{
std::cout << "~B()" << std::endl;
}
int main()
{
A *b = new B();
delete b;
}
결과
보너스) 생성자 소멸자 호출 순서
#include "pch.h"
#include <iostream>
class A {
public:
A();
virtual ~A();
};
class B : public A {
public:
B();
~B();
};
A::A()
{
std::cout << "A()" << std::endl;
}
A::~A()
{
std::cout << "~A()" << std::endl;
}
B::B()
{
std::cout << "B()" << std::endl;
}
B::~B()
{
std::cout << "~B()" << std::endl;
}
int main()
{
B *b = new B();
delete b;
}
결과
부모 생성자 -> 자식 생성자 -> 자식 소멸자 -> 부모 소멸자
'개발 > C++' 카테고리의 다른 글
C++ 스마트 포인터 (0) | 2019.05.07 |
---|---|
C++ Map, HashMap(unorder_map) 사용할 때 주의할 점 (0) | 2019.04.27 |
C++ 소켓 에코 채팅 구현하기 (0) | 2019.04.15 |
C++ HashMap 구현해보기 (unorder_map) (0) | 2019.03.03 |
C++ 맵 구현해보기 (0) | 2019.02.23 |