>  기사  >  백엔드 개발  >  기본 클래스 포인터에서 파생 클래스를 딥 카피하는 방법은 무엇입니까?

기본 클래스 포인터에서 파생 클래스를 딥 카피하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-25 23:09:28637검색

 How to Deep Copy Derived Classes from Base Class Pointers?

기본 클래스 포인터에서 파생 클래스 복사본 만들기

포인터에서 파생 클래스 인스턴스의 전체 복사본을 만드는 문제를 고려해보세요. 다형성 기본 클래스입니다. if 문에서 여러 유형 ID나 동적 캐스트에 의존하는 것은 지루하고 성능에 영향을 미칠 수 있으므로 이는 까다로울 수 있습니다.

선호되는 접근 방식은 기본 클래스 내에 clone()이라는 가상 메서드를 통합하는 것입니다. 또는 복사(). 이 메서드는 파생 클래스의 새로 생성된 복사본에 대한 포인터를 반환해야 합니다. 각 파생 클래스에서 이 메서드를 구현하면 복사 프로세스가 특정 파생 클래스 유형과 독립적이 됩니다.

또는 코드 중복을 피하기 위해 CRTP(Curiously Recurring Template Pattern) 관용구를 사용할 수 있습니다. 템플릿을 사용하면 복사 작업을 파생 클래스 생성자에 위임하는 도우미 클래스를 생성할 수 있습니다.

Clone() 메서드를 사용한 구현:

<code class="cpp">class Base {
  virtual Base* clone() const = 0;
};
class Derived1 : public Base {
  Base* clone() const { return new Derived1(*this); }
};
class Derived2 : public Base {
  Base* clone() const { return new Derived2(*this); }
};

Base* CreateCopy(Base* base) {
  return base->clone();
}</code>

CRTP 관용구를 사용한 구현:

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  Base* clone() const { return new Derived(static_cast<Derived&>(*this)); }
};

class Derived1 : public DerivationHelper<Derived1> { ... };
class Derived2 : public DerivationHelper<Derived2> { ... };</code>

위 내용은 기본 클래스 포인터에서 파생 클래스를 딥 카피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.