โดยการทำ ctor และการมอบหมายส่วนตัว (หรือโดยการประกาศเป็น = ลบใน C ++ 11) คุณปิดการคัดลอก
จุดนี่คือที่ที่คุณต้องทำ ที่จะอยู่กับรหัสของคุณ IAbstract ไม่ใช่ปัญหา (โปรดทราบว่าการทำสิ่งที่คุณทำคุณกำหนด*a1 IAbstractsubobject ให้กับ a2 สูญเสียการอ้างอิงใด ๆ ไปที่การDerivedกำหนดค่าไม่ใช่ polymorphic)
Derived::theproblemปัญหาที่มาพร้อมกับ คัดลอกมาลงในเดือนพฤษภาคมอีกในความเป็นจริงร่วมกัน*theproblemข้อมูลที่อาจจะไม่ได้ออกแบบให้ใช้ร่วมกัน (มีสองกรณีที่อาจเรียกdelete theproblemใน destructor ของพวกเขา)
หากเป็นกรณีนี้Derivedจะต้องไม่สามารถคัดลอกได้และไม่สามารถกำหนดได้ แน่นอนถ้าคุณทำสำเนาส่วนตัวIAbstractเนื่องจากสำเนาเริ่มต้นสำหรับDerivedความต้องการนั้นDerivedจะไม่สามารถคัดลอกได้ แต่ถ้าคุณกำหนดของคุณเองDerived::Derived(const Derived&)โดยไม่เรียกIAbtractคัดลอกคุณยังสามารถคัดลอกได้
ปัญหาอยู่ใน Derived และวิธีแก้ปัญหาต้องอยู่ใน Derived: ถ้ามันต้องเป็นวัตถุแบบไดนามิกเท่านั้นที่เข้าถึงได้โดยพอยน์เตอร์หรือการอ้างอิงเท่านั้นมันคือ Derived ตัวเองที่ต้องมี
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
โดยพื้นฐานแล้วมันก็ขึ้นอยู่กับผู้ออกแบบคลาส Derived (ซึ่งควรรู้ว่า Derived ทำงานอย่างไรและtheproblemมีการจัดการอย่างไร) เพื่อตัดสินใจว่าจะทำอย่างไรกับการมอบหมายและคัดลอก