函数可以返回虚拟对象吗?

时间:2015-06-23 15:20:32

标签: c++ function inheritance polymorphism

我正在修改代码,通过将类A放入虚拟类并添加两个类C和B作为派生类。 我有另一个D类,它最初有A的矢量作为成员。 D类中的一个函数的返回类型为A.由于A现在是一个虚拟基类,如何修改此函数以便它可以返回B或C?

3 个答案:

答案 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>并确保~Avirtual。然后,您可以将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)

您需要返回指向对象的指针,而不是实际对象。

如果您使用最近的编译器,我建议使用智能指针。