>  기사  >  백엔드 개발  >  다형성 기본 클래스 포인터에서 파생 클래스 인스턴스를 만드는 방법은 무엇입니까?

다형성 기본 클래스 포인터에서 파생 클래스 인스턴스를 만드는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-27 00:09:30608검색

 How to Create Derived Class Instances from Polymorphic Base Class Pointers?

다형성 기본 클래스 포인터에서 파생 클래스 인스턴스 생성

객체 지향 프로그래밍에서는 파생 클래스 인스턴스를 복사하거나 생성해야 하는 경우가 많습니다. 포인터에서 다형성 기본 클래스로의 클래스. 그러나 여러 파생 유형이 존재하는 경우 이 작업이 어려울 수 있습니다.

if 문에서 여러 유형 ID 또는 동적 캐스트를 사용하여 각 유형을 확인한 다음 새로운 유형을 사용하는 순진한 접근 방식은 비효율적이고 오류가 발생하기 쉽습니다. 더 나은 해결책은 기본 클래스에서 가상 메소드를 사용하여 복사본을 생성하는 것입니다.

Virtual clone() 메소드

가상 클론( ) 메서드를 기본 클래스에 포함하고 이를 각 파생 클래스에 구현하면 파생 클래스 인스턴스의 복사본을 동적으로 생성할 수 있습니다. clone() 메서드는 새로 생성된 복사본에 대한 포인터를 반환해야 합니다.

<code class="cpp">class Base {
  virtual ~Base();
  // Returns a dynamically created copy of this object
  virtual Base* clone() const = 0;
};</code>
<code class="cpp">class Derived1 : public Base {
  // Implements the clone() method for Derived1
  virtual Base* clone() const {
    return new Derived1(*this);
  }
};</code>
<code class="cpp">class Derived2 : public Base {
  // Implements the clone() method for Derived2
  virtual Base* clone() const {
    return new Derived2(*this);
  }
};</code>

이 접근 방식을 사용하면 파생 클래스 인스턴스의 복사본을 생성할 수 있습니다.

<code class="cpp">Base* basePtr = new Derived1();
Base* copyPtr = basePtr->clone();</code>

미니멀 구현을 위한 CRTP 관용구

clone() 메서드를 각 파생 클래스에서 사용하려면 CRTP(Curiously Recurring Template Pattern) 관용구를 사용할 수 있습니다.

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const {
    return new Derived(static_cast<const Derived&>(*this));
  }
};</code>
<code class="cpp">class Derived1 : public DerivationHelper<Derived1> {
  // Other members...
};</code>
<code class="cpp">class Derived2 : public DerivationHelper<Derived2> {
  // Other members...
};</code>
이 접근 방식은

clone() 메서드를 자동으로 구현합니다. 복사 생성자가 올바른 유형에 대해 호출되는지 확인하면서 각 파생 클래스에서.

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

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