Cập nhật: shared_ptr trong ví dụ này giống như trong Boost, nhưng nó không hỗ trợ shared_polymorphic_downcast (hoặc dynamic_pointer_cast hoặc static_pointer_cast cho vấn đề đó)!
Tôi đang cố gắng khởi tạo một con trỏ được chia sẻ tới một lớp dẫn xuất mà không làm mất số lượng tham chiếu:
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
Càng xa càng tốt. Tôi không mong đợi C ++ chuyển đổi ngầm định Base * thành Derived *. Tuy nhiên, tôi muốn chức năng được thể hiện bởi mã (nghĩa là, duy trì số lượng tham chiếu trong khi dự báo xuống con trỏ cơ sở). Suy nghĩ đầu tiên của tôi là cung cấp một toán tử ép kiểu trong Base để một chuyển đổi ngầm thành Derived có thể diễn ra (đối với người chạy bộ: Tôi sẽ kiểm tra xem việc truyền xuống có hợp lệ không, đừng lo lắng):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Chà, nó không giúp được gì. Có vẻ như trình biên dịch đã hoàn toàn bỏ qua toán tử typecast của tôi. Bất kỳ ý tưởng nào về cách tôi có thể làm cho bài tập shared_ptr hoạt động? Để biết thêm điểm: loại loại Base* const
là gì? const Base*
Tôi hiểu, nhưng Base* const
? Điều gì const
đề cập đến trong trường hợp này?