본문 바로가기
C++ STL, 알고리즘

파생 클래스의 복제 생성자와 대입 연산자

by wanna_dev 2024. 10. 7.

파생 클래스에서 포인터 같은 특수한 데이터(주로 포인터)가 있어서 디폴트가 아닌 복제 생성자나 대입 연산자를 정의해야할 경우가 아니라면 베이스 클래스에 복제 생성자나 대입 연산자가 있더라도 파생 클래스에서 다시 정의할 필요가 없다.

파생 클래스에서 복제 생성자나 대입 연산자를 정의하는 코드를 생략하면 파생 클래스의 데이터 멤버에 대한 디폴트 복제 생성자나 대입 연산자가 생성되고, 베이스 클래스의 데이터 멤버에 대해서는 베이스 클래스의 복제 생성자나 대입 연산자가 적용된다.

반면 파생 클래스에서 복제 생성자를 명시적으로 정의하면 다음 코드처럼 반드시 부모 클래스의 복제 생성자를 호출해야한다. 그렇지 않으면 객체에서 부모 부분에 대해 디폴트 생성자(복제 생성자가 아니다!) 가 사용된다.

class Base{
public:
	virtual ~Base() = default;
	Base() = default;
	Base(const Base& src);
};

Base::Base(const Base& src){}

class Derived : public Base
{
public:
	 Derived() = default;
	 Derived(const Derived& src);
}
Derived::Derived(const Derived& src) : Base(src){}

마찬가지로 파생 클래스에서 operator= 을 오버라이드 하면 객체의 일부분만 대입 연산을 적용할 때 처럼 극히 드문 경우를 제외하면 부모 버전의 대입 연산자도 함께 호출해야한다.

파생 클래스에서 부모 클래스의 대입 연산자를 호출하는 방법

Derived& Derived::operator=(const Derived& rhs){
	if(&rhs == this) return *this;
	
	Base::operator=(rhs); //부모의 대입 연산자를 호출한다.
	//파생 클래스의 대입 연산 수행(코드 생략)
	return *this;
}

파생 클래스에서 복제 생성자나 대입 연산자를 지정하지 않으면 베이스 클래스의 기능이 그대로 적용된다.

하지만 파생 클래스에서 복제 생성자나 대입 연산자를 별도로 정의했다면 베이스 클래스에 있는 것을 명시적으로 호출해야 사용할 수 있다.

 

참조 : 전문가를 위한 c++

'C++ STL, 알고리즘' 카테고리의 다른 글

Optional Type  (0) 2024.10.07
가상 베이스 클래스 (다이아몬드 상속 해결)  (0) 2024.10.07
Virtual  (0) 2024.10.07
스마트 포인터 c++  (0) 2024.10.07
memory leak detection  (0) 2024.10.02