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

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

Ser*_*eyA 6

发生这种情况是因为shared_ptr将类型擦除的删除器存储在控制块中,该块是在创建第一个时shared_ptr创建的。在你的情况下shared_ptr是为黄狗创建的,而删除器是调用黄狗析构函数。

当您将一个复制(或复制构建)shared_ptr到另一个时,它们会共享相同的控制块,并且新的共享 ptr 将从原始 ptr 调用删除器 - 将调用 Yellowdog 析构函数的那个​​。

但是,它并没有真正使类多态并适合工厂实现——类中的任何其他非虚拟函数都将基于 的静态类型被调用shared_ptr,并且您不希望在多态类中这样做。