【问题标题】:upcasting to interface with private inheritance向上转换为与私有继承的接口
【发布时间】:2020-10-28 17:02:04
【问题描述】:

我有以下情况

class Interface {
};

class ComplicatedObject : public Interface {
};

我想给出一个 ComplicatedObject 的简化版本,仍然提供接口。我在想私有继承,比如

class Simplified : private ComplicatedObject {
};

但是,当然,我不能像这样轻易地向上转换到接口

int main() {
  Interface* p = new Simplified();
}

组合是唯一的出路吗?还是有一些解决方法?比如隐式转换

【问题讨论】:

  • 您希望通过提供简化的界面来实现什么目标?有没有打算解决的问题?
  • 如果Simplified 也完全实现Interface 它可以继承它,但你需要虚拟继承。
  • 它在这里不起作用,因为你有一个拥有的指针,但考虑一个隐式转换运算符将Interface &转换为Simplified &。
  • 你可以使用一个公共静态方法来执行新的然后在返回时向上转换吗?
  • 您也许可以交换继承:Complicated 派生自 Simplified,而 Simplified 派生自 Interface。

标签: c++ upcasting private-inheritance


【解决方案1】:

组合是唯一的出路吗?

向上转换也不适用于合成。从类外的角度来看,私有继承实际上是组合。

或者有什么解决方法?

不是隐式的,但您可以提供一组返回对基的引用的成员函数。


更彻底的改变——但更明智——是改变前提并使用虚拟继承:

class Interface {};

class ComplicatedObject : public virtual Interface {};

class Simplified : private ComplicatedObject, public virtual Interface {};

这也可以在没有虚拟继承的情况下完成,但在这种情况下,您需要重新实现所有虚拟函数并明确委托给私有基。

【讨论】:

  • 我想我会选择作文;实际情况比这更复杂,虚拟继承应该一直传播到实际的继承树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多