Bagaimana untuk Menyalin Kelas Terhasil daripada Penunjuk Kelas Asas?

DDD
Lepaskan: 2024-10-25 23:09:28
asal
636 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!