gpt4 book ai didi

c++ - 在 C++ 中继承层次结构时提取实现者

转载 作者:行者123 更新时间:2023-12-03 20:35:30 25 4
gpt4 key购买 nike

编辑 在“ProductionNode”中公开 clear() 和 append()

我正在尝试在 C++ 中实现一个与“有效地使用旧代码”第 359 页中介绍的示例类似的示例,生成的图表类在第 361 页。

它使用多重继承;有一个基类“ProductionNode”,它完全实现了一个名为“Node”的接口(interface),第二个名为“ProductionModelNode”的基类继承自“ProductionNode”和另一个名为“ModelNode”的接口(interface),后者又继承自“Node”接口(interface).

当我尝试实例化“ProductionModelNode”时,编译器声称“Node”处定义的方法未实现,但它们在“ProductionNode”处实现。

#include<algorithm>
#include <string>

class Node
{
public:
virtual void clear() = 0;
virtual void append(const std::string&) = 0;
};


class ProductionNode : public Node
{
public:
virtual void clear() override
{
m_name.clear();
}

virtual void append(const std::string& suffix) override
{
m_name += suffix;
}

protected:
std::string m_name;
};


class ModelNode : public Node
{
public:
virtual void reverse() = 0;
virtual void uppercase() = 0;
};


class ProductionModelNode : public ModelNode, public ProductionNode
{
public:

virtual void reverse() override
{
std::reverse(std::begin(m_name), std::end(m_name));
}

virtual void uppercase() override
{
std::transform(m_name.begin(), m_name.end(), m_name.begin(), ::toupper);
}

private:
int m_age;
};


int main(int argc, char** argv)
{

ProductionModelNode mn;
return 0;
}

最佳答案

这是 Dreadful Diamond on Derivation 的案例。

类(class)ProductionModelNode有两个 Node parent ,一位来自 ProductionNode已实现,但另一个来自 ModelNode不是。

可能的“试用”解决方案:

  • ModelNode 中删除继承
  • 实现clearappendProductionModelNode
  • 使用虚拟继承

  • 使用虚拟继承的示例:
    class ProductionNode : virtual public Node
    ...
    class ModelNode: virtual public Node

    关于c++ - 在 C++ 中继承层次结构时提取实现者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58994358/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com