Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencipta Contoh Kelas Terhasil daripada Penunjuk Kelas Asas Polimorfik?

Bagaimana untuk Mencipta Contoh Kelas Terhasil daripada Penunjuk Kelas Asas Polimorfik?

DDD
DDDasal
2024-10-27 00:09:30517semak imbas

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

Mencipta Kejadian Kelas Terbitan daripada Penunjuk Kelas Asas Polimorfik

Dalam pengaturcaraan berorientasikan objek, selalunya perlu untuk menyalin atau mencipta contoh terbitan kelas daripada penunjuk kepada kelas asas polimorfik. Walau bagaimanapun, operasi ini boleh mencabar apabila wujud berbilang jenis terbitan.

Pendekatan naif menggunakan berbilang typeid atau dynamic_casts dalam pernyataan-if untuk menyemak setiap jenis dan kemudian menggunakan baharu adalah tidak cekap dan terdedah kepada ralat. Penyelesaian yang lebih baik ialah menggunakan kaedah maya dalam kelas asas untuk mencipta salinan.

Kaedah klon() maya

Dengan mentakrifkan klon maya( ) kaedah dalam kelas asas dan melaksanakannya dalam setiap kelas terbitan, adalah mungkin untuk mencipta salinan contoh kelas terbitan secara dinamik. Kaedah klon() harus mengembalikan penuding kepada salinan yang baru dibuat.

<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>

Menggunakan pendekatan ini, anda boleh mencipta salinan contoh kelas terbitan daripada penunjuk kelas asas seperti berikut:

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

Idiom CRTP untuk Pelaksanaan Minimalis

Untuk mengelakkan penduaan kod untuk melaksanakan klon() kaedah dalam setiap kelas terbitan, anda boleh menggunakan simpulan bahasa Curiously Recurring Template Pattern (CRTP):

<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>

Pendekatan ini secara automatik melaksanakan kaedah klon() dalam setiap kelas terbitan sambil memastikan bahawa pembina salinan dipanggil untuk jenis yang betul.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Contoh Kelas Terhasil daripada Penunjuk Kelas Asas Polimorfik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn