0
典型的工厂设计模式要求基类声明虚拟析构函数,但实际上可以使用shared_ptr
来避免这种情况。不含虚拟析构函数的多态的C++ 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
之前省略虚拟关键字?
由于用指针复制/传输的'Deleter'。 – Jarod42
因为'shared_ptr'很神奇。 :-S –
更清楚的是,'Deleter'与delete(Yellowdog *)p;'类似。您将通过'return shared_ptr(new Yellowdog())获得UB;'尽管如此。 –
Jarod42