我正在修改代码,通过将类A放入虚拟类并添加两个类C和B作为派生类。 我有另一个D类,它最初有A的矢量作为成员。 D类中的一个函数的返回类型为A.由于A现在是一个虚拟基类,如何修改此函数以便它可以返回B或C?
答案 0 :(得分:3)
您无法创建抽象类的实例,但您可以创建指向抽象类的指针。因此,不是A的向量,而是使它成为A的指针(甚至更好的智能指针)的向量,如下所示:
std::vector<std::unique_ptr<A>> vec;
您的函数声明应如下所示:
std::unique_ptr<A> FuncName(args);
答案 1 :(得分:1)
C ++中的值有一种类型。
有很多方法可以在不使用指针的情况下在C ++中实现多态(一个包含多种类型的变量),但它们很棘手。
简单的方法是让您的向量保持std::unique_ptr<A>
并确保~A
为virtual
。然后,您可以将B*
或C*
存储在unique_ptr<A>
。
由于禁止复制唯一的ptr,您必须确保将所有此类副本转换为移动,或将virtual unique_ptr<A> clone()const=0
接口添加到A
。
以前返回A
的函数现在应该返回unique_ptr<A>
。
存在发烧友的方法。您可以创建一个手动管理对象生命周期的值类型,例如,了解value_ptr<?>
接口的智能clone()
模板。
或者,您可以创建一个具有一种类型的值类型,但可以在其中以多态方式存储多种类型。
为了让您了解多态值类型计划的复杂程度,here是值类型的草图,可以通过A
存储多个派生类型的poly<A,B,C>
。它仍然需要使用访问器来获取A
接口,并且只是一个粗略的草图。我在这里只是说它可以解决问题:我不建议你使用这种技术,除非你已经证明这里存在性能瓶颈,而你已经用尽了替代解决方案。
答案 2 :(得分:0)
您需要返回指向对象的指针,而不是实际对象。
如果您使用最近的编译器,我建议使用智能指针。