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;
}
만약 위의 초기화 리스트를 빼면 다음과 같이 부모 복사 생성자가 호출되지 않는다.
자식은 부모의 멤버를 모두 갖고 있으므로, 대부분의 경우 복사를 할 때 부모까지 같이 복사를 해야 하므로 자식의 복사 생성자에서 부모의 복사 생성자를 먼저 호출해야 할 경우가 많다고 생각하므로, 위의 방법은 유용하다고 생각한다. 부모의 객체 타입에 자식 객체를 넣었고 자연스럽게 업캐스팅이 돼서 위와 같이 동작하는 것으로 보인다.
'공부 > C || C++' 카테고리의 다른 글
C++ vector의 resize vs reserve (0) | 2021.08.25 |
---|---|
C++ 오버라이딩시 반환 타입을 자식 클래스 타입으로 하면 반환 타입이 다르게 오버라이딩 된다 (0) | 2021.08.21 |
C++ return new(*this); 는 복사 생성자를 호출한다 (0) | 2021.08.17 |
C/C++ 파일 입출력 (0) | 2021.08.14 |
C/C++ 함수 포인터를 반환하는 함수 (0) | 2021.08.06 |