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 IAbstractsubobjek ke a2, kehilangan referensi apa pun Derived. Penugasan nilai bukan polimorfik)
Masalahnya datang dengan Derived::theproblem. Menyalin Turunan ke yang lain mungkin sebenarnya berbagi *theproblemdata yang mungkin tidak dirancang untuk dibagikan (ada dua contoh yang dapat memanggil delete theproblemdestruktor mereka).
Jika itu masalahnya, itu Derivedharus tidak dapat disalin dan tidak dapat dialihkan. Tentu saja, jika Anda membuat salinan pribadi dalam IAbstract, karena salinan default untuk Derivedkebutuhan itu, Derivedjuga tidak akan dapat disalin. Tetapi jika Anda mendefinisikan sendiri Derived::Derived(const Derived&)tanpa memanggil IAbtractsalinan, 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 theproblemdikelola) untuk memutuskan apa yang harus dilakukan dengan penugasan dan salinan.