Pembaruan: shared_ptr dalam contoh ini seperti yang ada di Boost, tetapi tidak mendukung shared_polymorphic_downcast (atau dynamic_pointer_cast atau static_pointer_cast dalam hal ini)!
Saya mencoba untuk menginisialisasi penunjuk bersama ke kelas turunan tanpa kehilangan jumlah referensi:
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;
Sejauh ini baik. Saya tidak berharap C ++ secara implisit mengubah Base * menjadi Derived *. Namun, saya menginginkan fungsionalitas yang diekspresikan oleh kode (yaitu, mempertahankan jumlah referensi sambil men-downcast penunjuk dasar). Pikiran pertama saya adalah menyediakan operator cor di Base sehingga konversi implisit ke Derived dapat terjadi (untuk pedants: Saya akan memeriksa apakah down cast valid, jangan khawatir):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Yah, itu tidak membantu. Sepertinya kompiler mengabaikan operator typecast saya. Ada ide bagaimana saya bisa membuat tugas shared_ptr bekerja? Untuk poin tambahan: tipe apa Base* const
itu? const Base*
Saya mengerti, tapi Base* const
? Apa yang dimaksud const
dalam kasus ini?