【发布时间】:2017-01-23 02:44:38
【问题描述】:
有很多话要说。首先,我想知道下面的方法是否被认为是一种设计模式甚至是一种通用技术(这就是为什么我没有提供有关标题的更多信息)。如果是这样,那叫什么名字? 无论如何,这是我想要实现的缩小版本。由于我需要使用复制,我发现使用 std::shared_ptr 是避免释放(删除)指针的最佳方式。
class Foo
{
public:
Foo() : ptr(nullptr) {}
Foo(const Foo& foo) : ptr(foo.ptr) {}
virtual ~Foo() = default;
void whatever() {
if (ptr)
ptr->whateverHandler();
}
void reset() {
ptr.reset();
}
void resetBar() {
ptr.reset(new Bar);
}
// Other resets here...
protected:
Foo(Foo* foo) : ptr(foo) {}
private:
// Every child class should override this
virtual void whateverHandler() {
throw "whateverHandler cant be called within base class";
}
protected:
std::shared_ptr<Foo> ptr;
};
class Bar : public Foo
{
public:
Bar() : Foo(this) {}
void whateverHandler() {
printf("Bar's handler!!! \n");
}
};
这一切看起来都很好并且编译得很好,但是,下面的考试崩溃了。这是为什么呢?
int main()
{
{
Foo f;
f.resetBar();
}
return getchar();
}
【问题讨论】:
-
当一个
Bar被销毁时,它的Foo被销毁两次 -
您可能需要
std::enable_shared_from_this。但是,在这个特定的示例中,您也不需要它 -
您还缺少虚拟析构函数。
-
@Danh 这正是发生的事情!为什么会这样?!
标签: c++ inheritance shared-ptr smart-pointers virtual-functions