【问题标题】:How can I override a pure virtual method using a privately inherited method?如何使用私有继承的方法覆盖纯虚拟方法?
【发布时间】:2014-08-21 09:14:40
【问题描述】:

我有以下几点:

class Abstract
{
    virtual void AbstractMethod() = 0;
};

class Implementer
{
    void AbstractMethod() {};
};

class Concrete : public Abstract, private Implementer
{};

我无法实例化Concrete,因为纯虚方法AbstractMethod 未被覆盖。我做错了什么?

【问题讨论】:

  • 你为什么不在实现者中从 Abstract 继承?
  • @Cogwheel - 在我看来,它更清楚地表达了我正在尝试使用的概念
  • 其实我觉得真的是这个的翻版:stackoverflow.com/q/23153328/103167

标签: c++ inheritance multiple-inheritance pure-virtual private-inheritance


【解决方案1】:

你在这里使用多重继承。

具体有两个单独处理的层次结构:

抽象和实现者。由于 Abstract 与 Implementer 没有关系,因此在这种情况下(用于兄弟继承)您使用 virtual 将失败。

您需要覆盖派生类中的虚函数。你不能以你正在尝试的方式做到这一点。

具体来说,如果您要这样重写它,它会起作用:

class Abstract
{
    virtual void AbstractMethod() = 0;
};

class Implementer : private Abstract
{
    void AbstractMethod() {};
};

class Concrete : public Implementer
{};

我想指出您在 Concrete 中使用公共或私有继承不会影响问题。如果您在原始示例中将 Implementer 更改为 public,它仍然不能成为一个具体的类。

有用的辅助信息:尽可能避免多重继承,支持组合而不是继承,并且更喜欢浅继承而不是深继承。 http://en.wikipedia.org/wiki/Composition_over_inheritance

如果您正在使用多重继承,请注意 C++ 中默认的单独继承层次结构,并且需要虚拟继承来组合不同的路径(虚拟方法仍然需要派生类来覆盖它们,而不是兄弟类不过):http://en.wikipedia.org/wiki/Multiple_inheritance

【讨论】:

  • 所以这两个层次不能以某种方式在Concrete 中以某种方式“统一”?
  • @Deduplicator - 我也无法编写程序,这也可以消除错误;)
  • @DanNestor 您可以使用虚拟继承来避免共享一个公共基类的多个层次结构,但不,这不是您希望虚拟方法覆盖的方式。
  • @DanNestor 最好尽可能限制对多重继承的使用。抽象基类的多重继承相对无害(据我所知,对于指定类似于 Java/C# 的接口很有用),但是当您共享状态时,它会变得相当复杂。这只是一个警告。在可能的情况下,优先考虑组合和浅层继承而不是深层和分支多态性。好读:en.wikipedia.org/wiki/Composition_over_inheritance
猜你喜欢
  • 2018-11-16
  • 2023-03-27
  • 1970-01-01
  • 2011-01-28
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多