在实际编程中,有时我们需要将一个指向父类对象的shared_ptr转换为指向子类对象的shared_ptr。这通常发生在多态的场景中,当我们知道某个父类指针实际上指向的是一个子类对象时,我们可能希望调用子类特有的方法或访问子类特有的成员。 3. 使用static_pointer_cast进行shared_ptr从父类到子类的转换方法 C++标准库提供了...
如果要确保对象可以正常析构,则需要将父类的析构函数声明为虚函数。这样通过父类指针delete时,可确保子类对象的析构函数被正常调用。 正常情况下的执行结果如下图所示,父类及子类的析构函数都可以被调用: 如果父类的析构函数不是虚函数,则结果如下图: 可以看到,只有父类的析构函数被调用了。子类的析构函数并...
原因是我们只简单地写了一个template<class T>, 对于父类指针shared_ptr<Base>传入子类指针Derived *的时候, 类型T会把Derived转换成Base, 自然调用析构函数的时候就不会考虑到子类的析构了. 当然我们可以用虚函数让子类成功析构, 但是作为库的开发者你不能强迫用户写额外不必要的代码. 所以其实我们可以用类型擦...
如果要确保对象可以正常析构,则需要将父类的析构函数声明为虚函数。这样通过父类指针delete时,可确保子类对象的析构函数被正常调用。 正常情况下的执行结果如下图所示,父类及子类的析构函数都可以被调用: 如果父类的析构函数不是虚函数,则结果如下图: 可以看到,只有父类的析构函数被调用了。子类的析构函数并...
std::shared_ptr的相关代码主要包含shared_ptr,__shared_ptr,__shared_ptr_access,__shared_count还有_Sp_counted_base这几个class。它们之间的关系见下图。 shared_ptr 作为主要面向用户的class,shared_ptr将大部分功能都委托给了其父类__shared_ptr,也只保留了一个模板参数_Tp(这一点和unique_ptr不同,没有...
#include<memory>// everything is an Object - yuk, but ok, if you wish...struct Object:std:...
private:sp_counted_base*pi;//有一个指向引用计数器父类的指针; 1. 2. 此时就得先写:sp_counted_base类了; sp_counted_base类中的私有数据成员: private:longuse_count_; 1. 2. 然后看到在shared_counted的构造函数: public:template<classT>//此时类型不定,写模板函数shared_count(T*p):pi(newsp_cou...
weak_ptr不会增加引用计数,因此可以打破 shared_ptr 的循环引用。通常在继承关系中的做法是父类持有子类的 shared_ptr,子类持有指向父类的 weak_ptr。 参考: 《Linux多线程服务端编程》陈硕 https://stackoverflow.com/questions/18301511 https://stackoverflow.com/questions/712279 ...
virtual ~B() = default;//父类的析构函数需要定义为虚函数,防止内存泄漏 }; struct D : B { D() { std::cout << "D::D\n"; } ~D() { std::cout << "D::~D\n"; } void bar() override { std::cout << "D::bar\n"; } ...
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...