본문 바로가기

C++

[C++] 상속관계에서 복사 생성자 호출

상속관계에서 자식 클래스의 복사 생성자를 호출할 때 부모의 복사 생성자도 호출하기 위해서는 초기화 리스트를 사용해야 한다.

 

CParent::CParent()
{
	std::cout << "Parent constructor" << std::endl;
}

CParent::~CParent()
{
	std::cout << "Parent destructor" << std::endl;
}

CParent::CParent(const CParent& Parent)
{
	std::cout << "Parent copy constructor" << std::endl;
}
// Child.h

CChild::CChild()
{
	std::cout << "Child constructor" << std::endl;
}

CChild::~CChild()
{
	std::cout << "Child destructor" << std::endl;
}

CChild::CChild(const CChild& Child) :
	CParent(Child)	// 초기화 리스트로 부모의 복사 생성자 먼저 호출되게 함
{
	std::cout << "Child copy constructor" << std::endl;
}
int main()
{
	CChild obj1;
	CChild obj2 = obj1;

	return 0;
}

 

위처럼 초기화 리스트로 부모의 복사 생성자를 호출하게 하지 않으면 부모의 디폴트 복사 생성자가 호출되어 부모의 멤버가 제대로 복사되지 않을 가능성이 있다. 

 

 

좌측은 초기화 리스트로 부모의 복사 생성자를 호출 해서 부모, 자식의 복사 생성자가 호출되고, 우측은 초기화 리스트를 선언하지 않았을 때인데 부모의 생성자(디폴트 복사 생성자)만 호출되었다.

 

 

출처: https://welikecse.tistory.com/70