자식 클래스에서 특별히 필요하지 않으면 복사 생성자를 생성하지 않고 디폴트 복사 생성자를 이용할 수 있다. 컴파일러는 복사 생성자가 정의되지 않으면 알아서 디폴트 복사 생성자를 생성한다. 그러나 깊은 복사를 위해 직접적으로 복사 생성자를 정의한다고 할 때, 자식 클래스에서 부모 클래스의 복사 생성자를 명시적으로 호출해주지 않을 경우 부모 클래스의 멤버에 대해 복사 생성자가 호출되지 않고 디폴트 생성자가 호출되는데 그친다.
#include <iostream>
using
namespace
std;
class
Parent
{
private
:
int
x;
public
:
Parent(
int
n = 0) : x(n) {}
Parent(
const
Parent& copy) : x(copy.x) {}
int
getX() {
return
x; }
};
class
Child :
public
Parent
{
private
:
int
y;
public
:
Child(
int
n1 = 0,
int
n2 = 0) : Parent(n1), y(n2) {}
Child(
const
Child& copy) : y(copy.y) {}
int
getY() {
return
y; }
};
int
main(
void
)
{
Child c1(1);
Child c2(c1);
cout << c1.getX() <<
','
<< c1.getY() << endl;
cout << c2.getX() <<
','
<< c2.getY() << endl;
return
0;
}
1,0 0,0 |
부모 클래스의 멤버에 대해 정상적으로 복사 생성자가 호출되기 위해 자식 클래스의 복사 생성자에서 명시적으로 부모 클래스의 복사 생성자를 호출해주자.
1 |
Child( const Child& copy) : Parent(copy), y(copy.y) {} |
1,0 1,0 |
반응형
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
__declspec(align(n)) 으로 바이트 정렬하기 (0) | 2018.02.10 |
---|---|
__attribute__ ((noinline)) (0) | 2017.05.14 |
클로져 객체의 복사 생성자와 소멸자 (0) | 2016.07.18 |
shared_ptr 순환 참조의 문제 weak_ptr (0) | 2016.07.17 |
가변 템플릿 typename... T (0) | 2016.07.07 |