智能指针和派生类
Smart pointers and derived classes
我将在std::list
中存储大量对象。
由于我需要这些对象来存储不同类型的数据,所以我存储指向一个基类的指针,该基类只保存enum
类型的属性,该属性"告诉"对象它应该被广播到哪个派生类。每个派生类都有自己的数据类型:
struct Base {
enum class Type {
D1,
D2,
...
} type;
Base(Type new_type):
type(new_type) {}
};
struct D1: public Base {
std::string data;
D1(std::string new_data):
Base(Base::Type::D1), data(new_data) {}
};
struct D2: public Base {
double data;
D2(double new_data):
Base(Base::Type::D2), data(new_data) {}
};
为了保存指向这些对象的指针,我使用了智能指针:
std::list<std::unique_ptr<Base>> list;
list.push_back(std::unique_ptr<Base>(new D1("Somestring")));
list.push_back(std::unique_ptr<Base>(new D2(3.14)));
然而,虽然每个Base对象都知道应该将其强制转换为什么类型才能正确删除,但智能指针只知道它必须调用Base的析构函数。这将使每个子类分配的内存无法删除。
如何将自定义deleter传递给智能指针,以便它们知道如何正确地转换和释放每个对象的内存?我应该实现什么自定义deleter?
只需将Base
的析构函数标记为virtual
即可。然后,默认的deleter将调用delete pointer_to_raw_object;
,它将根据object
的动态类型调用正确的析构函数。
示例:
#include <iostream>
#include <memory>
#include <list>
struct Base
{
virtual ~Base(){std::cout << __PRETTY_FUNCTION__ << std::endl;}
};
struct Derived : Base
{
~Derived() override {std::cout << __PRETTY_FUNCTION__ << std::endl;}
};
int main()
{
std::list<std::unique_ptr<Base>> l;
l.emplace_back(new Base);
l.emplace_back(new Derived);
}
在Coliru上直播
PS:考虑使用std::list::emplace_back
来获得更干净(更高效(的代码。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 如何使用基类指针引用派生类成员
- 将派生指针分配给C 中的其他派生类型
- 如何通过派生指针调用基类中的模板成员函数
- 如何将带有恒定指针作为参数的模板的派生指针使用
- 无法返回包含派生指针的向量
- 如何创建派生指针类变量
- C++强制转换为派生指针或设计错误
- 无法从派生指针访问公共基成员
- C++发送派生指针作为参数
- 将专用基指针强制转换为专用于其他模板参数的派生指针("adding on"专用化)
- 在派生指针上显式调用基类析构函数时编译错误
- 安全派生指针值的示例
- 安全派生指针的整数表示形式
- c++多态克隆:如何从基指针获得派生指针
- 如果我将派生指针转换为基指针,这两个指针是否保证具有相同的值?
- 以任何方式将基指针强制转换为派生指针是否危险
- 将派生指针隐式强制转换为其相应基类的引用
- 当派生指针仅添加方法时,将基指针强制转换为派生指针的有效性
- c++转换指针到派生指针到基指针的例子