Ông Lidström và tôi đã có một cuộc tranh cãi :)
Tuyên bố của ông Lidström là một cấu trúc shared_ptr<Base> p(new Derived);
không yêu cầu Base phải có một trình hủy ảo:
Armen Tsirunyan : "Thật sao? Liệu shared_ptr dọn dẹp một cách chính xác? Bạn có thể vui lòng trong trường hợp này chứng minh hiệu ứng đó có thể được thực hiện như thế nào?"
Daniel Lidström : " shared_ptr sử dụng trình hủy của chính nó để xóa phiên bản Concrete. Đây được gọi là RAII trong cộng đồng C ++. Lời khuyên của tôi là bạn nên tìm hiểu tất cả những gì có thể về RAII. Nó sẽ giúp việc viết mã C ++ của bạn dễ dàng hơn rất nhiều khi bạn sử dụng RAII trong mọi tình huống. "
Armen Tsirunyan : "Tôi biết về RAII và tôi cũng biết rằng cuối cùng trình hủy shared_ptr có thể xóa px được lưu trữ khi pn đạt đến 0. Nhưng nếu px có con trỏ kiểu tĩnh
Base
và con trỏ kiểu động đếnDerived
, thì trừ khiBase
có trình hủy ảo, điều này sẽ dẫn đến hành vi không xác định. Hãy sửa cho tôi nếu tôi sai. "Daniel Lidström : " shared_ptr biết kiểu tĩnh là Bê tông. Nó biết điều này từ khi tôi chuyển nó vào hàm tạo của nó! Có vẻ hơi giống phép thuật, nhưng tôi có thể đảm bảo với bạn rằng nó là do thiết kế và cực kỳ đẹp."
Vì vậy, hãy phán xét chúng tôi. Làm thế nào để có thể (nếu có) triển khai shared_ptr mà không yêu cầu các lớp đa hình phải có hàm hủy ảo? Cảm ơn trước