Dengan membuat ctor dan tugas pribadi (atau dengan mendeklarasikannya sebagai = delete di C ++ 11) Anda menonaktifkan salinan.
Intinya di sini adalah DI MANA Anda harus melakukan itu. Untuk tetap menggunakan kode Anda, IAbstract tidak menjadi masalah. (perhatikan bahwa melakukan apa yang Anda lakukan, Anda menetapkan *a1
IAbstract
subobjek ke a2, kehilangan referensi apa pun Derived
. Penugasan nilai bukan polimorfik)
Masalahnya datang dengan Derived::theproblem
. Menyalin Turunan ke yang lain mungkin sebenarnya berbagi *theproblem
data yang mungkin tidak dirancang untuk dibagikan (ada dua contoh yang dapat memanggil delete theproblem
destruktor mereka).
Jika itu masalahnya, itu Derived
harus tidak dapat disalin dan tidak dapat dialihkan. Tentu saja, jika Anda membuat salinan pribadi dalam IAbstract
, karena salinan default untuk Derived
kebutuhan itu, Derived
juga tidak akan dapat disalin. Tetapi jika Anda mendefinisikan sendiri Derived::Derived(const Derived&)
tanpa memanggil IAbtract
salinan, Anda masih dapat menyalinnya.
Masalahnya adalah dalam Derived, dan solusinya harus tetap ke Derived: jika itu harus objek dinamis yang hanya diakses oleh pointer atau referensi, itu adalah Derived itu sendiri yang harus memiliki
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
Pada dasarnya tergantung pada perancang kelas Derived (yang seharusnya tahu bagaimana Derived bekerja dan bagaimana theproblem
dikelola) untuk memutuskan apa yang harus dilakukan dengan penugasan dan salinan.