【问题标题】:Can functions return virtual objects?函数可以返回虚拟对象吗?
【发布时间】:2015-09-09 11:51:41
【问题描述】:

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

【问题讨论】:

标签: c++ function inheritance polymorphism


【解决方案1】:

您不能创建抽象类的实例,但可以创建指向抽象类的指针。因此,与其使用 A 的向量,不如将其设为指向 A 的指针(甚至更好的是智能指针)向量,如下所示:

std::vector<std::unique_ptr<A>> vec;

您的函数声明应如下所示:

std::unique_ptr<A> FuncName(args);

【讨论】:

  • 你的意思可能是“你不能创建抽象类的实例”没有像虚拟类这样的东西。
  • 意思是纯虚拟的。谢谢。
  • 只有函数可以是纯虚函数,不适用于类。如果一个类包含纯虚函数声明,则称为抽象类
  • @πάνταῥεῖ,感谢您指出我的错误并帮助我改进答案,而不是投反对票。这更令人鼓舞和富有成效。
  • 你很幸运,今天是我的生日 ;-) ...不,我不会因为稍微滥用的术语而对答案投反对票。
【解决方案2】:

C++ 中的值只有一种类型。

有一些方法可以在不使用指针的情况下在 C++ 中实现多态性(一个变量持有多种类型),但它们很棘手。

简单的方法是让你的向量保持std::unique_ptr&lt;A&gt; 并确保~Avirtual。然后您可以将B*C* 存储在unique_ptr&lt;A&gt; 中。

由于禁止复制独特的 ptr,您必须确保将任何此类复制转换为招式,或将 virtual unique_ptr&lt;A&gt; clone()const=0 接口添加到 A

以前返回 A 的函数现在应该返回 unique_ptr&lt;A&gt;


存在更高级的方法。您可以创建一个手动管理对象生命周期的值类型,例如,或理解clone() 接口的智能value_ptr&lt;?&gt; 模板。

或者,您可以创建一个具有一种类型的值类型,但可以多态地在其中存储多个类型。

为了让您了解多态值类型计划的复杂程度,here 是一个值类型的草图,它可以通过poly&lt;A,B,C&gt; 存储A 的多个派生类型。它仍然需要使用访问器来访问A 接口,并且只是一个粗略的草图。我在这里只是说问题可以解决:我不建议您使用这种技术,除非您已经证明这里存在性能瓶颈,并且您已经用尽了替代解决方案。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多