【发布时间】:2020-09-21 06:38:20
【问题描述】:
我希望超类的所有孩子都执行类似的操作。所以我想我可以在超类中有一个方法来做到这一点。该操作需要将自身的副本(或 shared_ptr 发送到)作为方法的参数。但是我不知道这样的事情是否可行,如果可以,应该怎么做。
为了澄清我的问题,请考虑以下示例。我希望打印输出是“孩子”和“父母”。当前代码打印出“父母”和“父母”。当然,这是预期的,因为我将复制 *this 作为 make_shared 中的 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();
}
【问题讨论】:
-
virtual std::shared_ptr<Parent> getPtr() const { return std::make_shared<Parent>(*this); }在 Parent 类中,std::shared_ptr<Parent> getPtr() const override { return std::make_shared<Child1>(*this); }在 Child1 类中。
标签: c++ subclass superclass virtual-functions