2. 从父类shared_ptr转到子类shared_ptr的需求场景 在实际编程中,有时我们需要将一个指向父类对象的shared_ptr转换为指向子类对象的shared_ptr。这通常发生在多态的场景中,当我们知道某个父类指针实际上指向的是一个子类对象时,我们可能希望调用子类特有的方法或访问子类特有的成员。
原因是我们只简单地写了一个template<class T>, 对于父类指针shared_ptr<Base>传入子类指针Derived *的时候, 类型T会把Derived转换成Base, 自然调用析构函数的时候就不会考虑到子类的析构了. 当然我们可以用虚函数让子类成功析构, 但是作为库的开发者你不能强迫用户写额外不必要的代码. 所以其实我们可以用类型擦...
__shared_ptr_access 该class是__shared_ptr的父类,主要提供了对shared_ptr所存储内容的访问接口operator*() 和operator->(): // Define operator* and operator-> for shared_ptr<T>.template<typename_Tp,_Lock_policy_Lp,bool=is_array<_Tp>::value,bool=is_void<_Tp>::value>class__shared_ptr_acc...
可以看到,只有父类的析构函数被调用了。子类的析构函数并没有被调用,则产生错误。 这一点上,对于原始的指针或者std::unique_ptr。其表现是一致的。也符合C++基本的语法。 但是对于std::shared_ptr。即便父类析构函数并非虚函数,其子类的析构函数依然可以被调用。 对于此种行为的原因尚未查明(待更新)。也许这是...
但是对于std::shared_ptr。即便父类析构函数并非虚函数,其子类的析构函数依然可以被调用。 对于此种行为的原因尚未查明(待更新)。也许这是std::shared_ptr专门设计的一种特性。但为谨慎起见,我们也未必需要此特性。 C++11中引入了新的关键字“override”。对于子类中要实现多态(即要对父类方法进行override)的方法...
weak_ptr不会增加引用计数,因此可以打破 shared_ptr 的循环引用。通常在继承关系中的做法是父类持有子类的 shared_ptr,子类持有指向父类的 weak_ptr。 参考: 《Linux多线程服务端编程》陈硕 https://stackoverflow.com/questions/18301511 https://stackoverflow.com/questions/712279 ...
sp_counted_base_impl 是个模板, 它继承自sp_counted_base, 主要实现了父类中一个纯虚函数dispose。具体的由它来负责在记数值到0(即没有代理时)释放所托管的资源。shared_count是个类模板。它存在的意义在于和代理类shared_ptr同生共死, 在构造函数中生成记数器,在代理的传递过程中驱动记数器增减。 shared_...
classparent;classchild;typedefboost::shared_ptr<parent>parent_ptr;typedefboost::shared_ptr<child>child_ptr;classparent{public:~parent(){std::cout<<"父类析构函数被调用.\n";}public:child_ptr children;};classchild{public:~child(){std::cout<<"子类析构函数被调用.\n";}public:parent_ptr paren...
typedefshared_ptr<parent>parent_ptr;typedefshared_ptr<child>child_ptr;classparent{public:~parent(){std::cout<<"父类析构函数被调用.\n";}public:child_ptr children;};classchild{public:~child(){std::cout<<"子类析构函数被调用.\n";}public:parent_ptr parent;};intmain(){parent_ptrfather(new...
std::cout <<"父类析构函数被调用.\n"; } public: child_ptr children; }; class child { public: ~child() { std::cout <<"子类析构函数被调用.\n"; } public: parent_ptr parent; }; int main() { parent_ptr father(new parent()); ...