在 C++ 中是否有可能在超类中有一个方法,当每个子类 returns 调用该子类的 shared_ptr 时?

Is it possible in C++ to have a method in the superclass that when called by each subclass returns a shared_ptr to that subclass?

我希望超类的所有 children 都执行类似的操作。所以我想我可以在超类中有一个方法来这样做。该操作需要将自身的副本(或 shared_ptr 发送给)作为方法的参数。但是我不知道这样的事可不可以,如果可以,应该怎么做。

为了澄清我的问题,请考虑以下示例。我希望打印输出为 "Child" 和 "Parent"。当前代码打印出 "Parent" 和 "Parent"。当然,这是从这段代码中得到的,因为我正在返回复制 *this 作为 make_shared.

中的 Parent 类型

问题是我是否可以获得预期的行为。请注意,在实际情况下,有很多 children,因此在每个案例中实现函数 getPtr() 并不容易。

感谢您的帮助。

class Parent
{
public:
  std::shared_ptr<Parent> getPtr() { return std::make_shared<Parent>(*this); } // I tried make_shared<decltype(*this)> also, but the code does not compile.

  virtual void printName() const { std::cout << "Parent\n"; }
};

class Child1 : public Parent {
  void printName() const override { std::cout << "Child\n"; }
};

int main() {
  Child1 c;
  auto cPtr = c.getPtr();
  cPtr->printName();       // I want this to print "Child", but it prints "Parent" (as expected)

  Parent p;
  auto pPtr = p.getPtr();
  pPtr->printName();
}

不完全清楚你在做什么,但你肯定想从 std::enable_shared_from_this 派生你的 Parent

这将为您提供一个成员函数 shared_from_this()(这或多或少是您想通过 getPtr() 实现的)。

但是,必须强调您的 Parent 对象本身必须由 std::shared_ptr 管理。即,这仅在

时有效
std::shared_ptr<Parent> p = std::make_shared<Parent>();

那你可以用p->shared_from_this()给你一个共享指针