Bằng cách đặt ctor và gán riêng tư (hoặc bằng cách khai báo chúng là = xóa trong C ++ 11), bạn vô hiệu hóa bản sao.
Vấn đề ở đây là bạn phải làm điều đó ở đâu. Để giữ nguyên mã của bạn, I Ab. Không phải là vấn đề. (lưu ý rằng làm những gì bạn đã làm, bạn gán tiểu dự án *a1 IAbstractcho a2, mất bất kỳ tham chiếu nào Derived. Việc gán giá trị không phải là đa hình)
Vấn đề đi kèm Derived::theproblem. Việc sao chép một Derogen vào một cái khác trong thực tế có thể chia sẻ *theproblemdữ liệu có thể không được thiết kế để chia sẻ (có hai trường hợp có thể gọi delete theproblemtrong hàm hủy của chúng).
Nếu đó là trường hợp, đó là Derivedphải không thể sao chép và không thể chuyển nhượng. Tất nhiên, nếu bạn đặt riêng tư bản sao vào IAbstract, vì bản sao mặc định cho Derivednhu cầu của nó, Derivedcũng sẽ không thể sao chép . Nhưng nếu bạn xác định bản thân Derived::Derived(const Derived&)mà không gọi IAbtractbản sao, bạn vẫn có thể sao chép chúng.
Vấn đề nằm ở Derogen và giải pháp phải nằm trong Derogen: nếu nó phải là một đối tượng chỉ động chỉ được truy cập bởi các con trỏ hoặc tham chiếu, thì chính Der Der phải có
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
Về cơ bản, tùy thuộc vào người thiết kế lớp Derogen (cần biết cách thức hoạt động của Derogen và cách theproblemquản lý) để quyết định làm gì với sự phân công và sao chép.