gpt4 book ai didi

没有虚拟析构函数的多态性中的c++ shared_ptr

转载 作者:行者123 更新时间:2023-11-30 01:43:59 26 4
gpt4 key购买 nike

典型的工厂设计模式需要基类声明虚析构函数,但这实际上可以使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com