在C++中,是否可以在超类中设置一个方法,当每个子类调用该方法时,返回一个shared_ptr给该子类?

问题描述 投票:0回答:1

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

为了澄清我的问题,请考虑下面的例子。我希望打印出来的是 "Child "和 "Parent"。目前的代码打印出的是 "Parent "和 "Parent"。当然这也是这个代码的预期,因为我在make_shared里面把复制*this作为Parent类型返回。

问题是我能否得到预期的行为。请注意,在实际情况中,有很多子类型,所以在每个子类型中实现函数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();
}
c++ subclass superclass virtual-functions
1个回答
1
投票

虽然不完全清楚你在做什么,但你肯定想派生出你的超级类。Parentstd::enable_shared_from_this.

这将给你一个成员函数 shared_from_this() (这也是您想通过以下方式实现的目标) getPtr()).

然而,必须强调的是,你的 Parent 对象本身必须由 std::shared_ptr. 也就是说,只有在以下情况下,这种做法才会有效

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

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

© www.soinside.com 2019 - 2024. All rights reserved.