본문 바로가기

개발/C++

C++ 가상 소멸자 (feat. 상속 생성자 소멸자 호출순서)

상속을 할때 소멸자에 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