Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencipta Contoh Kelas Terhasil daripada Penunjuk Kelas Asas Polimorfik?
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!