c++ - 如何使用私有(private)继承的方法覆盖纯虚方法?

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

我有以下内容:

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

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

class Concrete : public Abstract, private Implementer
{};

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

最佳答案

你在这里使用了多重继承。

Concrete 有两个分别处理的层次结构:

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

您需要覆盖派生类中的虚函数。你不能按照你尝试的方式去做。

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

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

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

class Concrete : public Implementer
{};

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

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

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

关于c++ - 如何使用私有(private)继承的方法覆盖纯虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24499622/

相关文章:

c++ - 使用 borland 编译器 5.82 运行 boost 库

c++ - 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配

PHP 兄弟类继承

c++ - 有没有需要多重继承的场景?

c++ - 通过统一缓冲区对象发送到 GLSL 的数据泄漏到其他绘制调用中 (OpenGL 3.2)

c++ - 为什么在我释放其最后一个 COM 接口(interface)后 MS Word 没有关闭?

python - 虚拟类 : doing it right?

javascript - John Resig 的 Javascript 继承片段是否已弃用?

c++ - 不确定在尝试扩展我的堆栈功能时是否使用继承

oop - 为什么大多数编程语言不支持多重继承?