Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyalin Kelas Terhasil daripada Penunjuk Kelas Asas?

Bagaimana untuk Menyalin Kelas Terhasil daripada Penunjuk Kelas Asas?

DDD
DDDasal
2024-10-25 23:09:28637semak imbas

 How to Deep Copy Derived Classes from Base Class Pointers?

Mencipta Salinan Kelas Terbitan daripada Penunjuk Kelas Asas

Pertimbangkan cabaran untuk mencipta salinan dalam contoh kelas terbitan daripada penuding kepada kelas asas polimorfiknya. Ini boleh menjadi rumit, kerana bergantung pada ID berbilang jenis atau hantaran dinamik dalam pernyataan if boleh menjadi membosankan dan memperkenalkan implikasi prestasi.

Pendekatan pilihan melibatkan menggabungkan kaedah maya dalam kelas asas, yang dikenali sebagai clone() atau salinan(). Kaedah ini harus mengembalikan penunjuk kepada salinan kelas terbitan yang baru dibuat. Dengan melaksanakan kaedah ini dalam setiap kelas terbitan, proses penyalinan menjadi bebas daripada jenis kelas terbitan tertentu.

Sebagai alternatif, untuk mengelakkan pertindihan kod, simpulan bahasa Curiously Recurring Template Pattern (CRTP) boleh digunakan. Menggunakan templat, kelas pembantu boleh dibuat yang mewakilkan operasi salin kepada pembina kelas terbitan.

Pelaksanaan Menggunakan Kaedah Klon():

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

Pelaksanaan Menggunakan Idiom 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>

Atas ialah kandungan terperinci Bagaimana untuk Menyalin Kelas Terhasil daripada Penunjuk Kelas Asas?. 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