作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
典型的工厂设计模式需要基类声明虚析构函数,但这实际上可以使用shared_ptr
来避免。
#include <iostream>
#include <memory>
#include <cstdio>
using namespace std;
class Dog {
public:
~Dog() { cout << "dog destroyed\n"; }
};
class Yellowdog : public Dog {
public:
~Yellowdog() { cout << "Yellow dog destroyed.\n"; }
};
class DogFactory {
public:
static shared_ptr<Dog> createYellowdog() {
return shared_ptr<Yellowdog>(new Yellowdog());
}
};
int main(int argc, char *argv[]) {
auto ptr = DogFactory::createYellowdog();
cout << ptr.use_count() << endl;
return 0;
}
在这种情况下,输出是 yellowdog destroyed
,然后是 dog destroyed
。但为什么?为什么使用shared_ptr
可以省略~Dog
前的virtual关键字?
最佳答案
这是因为 shared_ptr
在控制 block 中存储了类型删除的删除器,它是在创建第一个 shared_ptr
时创建的。在你的例子中,shared_ptr
是为 yellow dog 创建的,删除器是调用 yellow-dog 的析构函数。
当您将一个 shared_ptr
复制(或复制构造)到另一个时,它们共享相同的控制 block ,并且新的共享 ptr 将调用原始的删除器一个 - 将调用 yellowdog 析构函数的那个。
但是,它并没有真正使类多态化并适合工厂实现 - 类中的任何其他非虚函数都将基于 shared_ptr
的静态类型被调用,而您不需要在多态类中需要这个。
关于没有虚拟析构函数的多态性中的c++ shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36920908/
我是一名优秀的程序员,十分优秀!