Jes*_*Jes 3 c++ polymorphism factory
典型的工厂设计模式需要基类声明虚拟析构函数,但这实际上可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输出yellowdog destroyed后跟dog destroyed. 但为什么?为什么 using 之前shared_ptr可以省略 virtual 关键字~Dog?
发生这种情况是因为shared_ptr将类型擦除的删除器存储在控制块中,该块是在创建第一个时shared_ptr创建的。在你的情况下shared_ptr是为黄狗创建的,而删除器是调用黄狗析构函数。
当您将一个复制(或复制构建)shared_ptr到另一个时,它们会共享相同的控制块,并且新的共享 ptr 将从原始 ptr 调用删除器 - 将调用 Yellowdog 析构函数的那个。
但是,它并没有真正使类多态并适合工厂实现——类中的任何其他非虚拟函数都将基于 的静态类型被调用shared_ptr,并且您不希望在多态类中这样做。