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
IAbstract
cho 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ẻ *theproblem
dữ liệu có thể không được thiết kế để chia sẻ (có hai trường hợp có thể gọi delete theproblem
trong hàm hủy của chúng).
Nếu đó là trường hợp, đó là Derived
phả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 Derived
nhu cầu của nó, Derived
cũ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 IAbtract
bả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 theproblem
quản lý) để quyết định làm gì với sự phân công và sao chép.