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

DDD
Lepaskan: 2024-10-27 00:09:30
asal
516 orang telah melayarinya

 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>
Salin selepas log masuk
<code class="cpp">class Derived1 : public Base {
  // Implements the clone() method for Derived1
  virtual Base* clone() const {
    return new Derived1(*this);
  }
};</code>
Salin selepas log masuk
<code class="cpp">class Derived2 : public Base {
  // Implements the clone() method for Derived2
  virtual Base* clone() const {
    return new Derived2(*this);
  }
};</code>
Salin selepas log masuk

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

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>
Salin selepas log masuk
<code class="cpp">class Derived1 : public DerivationHelper<Derived1> {
  // Other members...
};</code>
Salin selepas log masuk
<code class="cpp">class Derived2 : public DerivationHelper<Derived2> {
  // Other members...
};</code>
Salin selepas log masuk

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!

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!