공부/C || C++

C++ 자식 클래스 복사 생성자 초기화 리스트에서 부모의 복사 생성자 호출하는 방법

sudo 2021. 8. 17. 20:04

CChild 클래스가 CParent 클래스를 상속 받고 있는 상황에서 CChild의 복사 생성자가 호출될 때 초기화 리스트를 사용해서 부모의 복사 생성자를 먼저 호출되게 하는 방법이 있다.

// Parent.h

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;
}

만약 위의 초기화 리스트를 빼면 다음과 같이 부모 복사 생성자가 호출되지 않는다.

자식은 부모의 멤버를 모두 갖고 있으므로, 대부분의 경우 복사를 할 때 부모까지 같이 복사를 해야 하므로 자식의 복사 생성자에서 부모의 복사 생성자를 먼저 호출해야 할 경우가 많다고 생각하므로, 위의 방법은 유용하다고 생각한다. 부모의 객체 타입에 자식 객체를 넣었고 자연스럽게 업캐스팅이 돼서 위와 같이 동작하는 것으로 보인다.