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

Extract implementer when inheritance hierarchy in C++

本文关键字:提取 实现者 层次结构 C++ 继承      更新时间:2023-10-16

Edit 在"ProductionNode"中公开了clear((和append((


我正在尝试C++实现一个与"有效使用遗留代码"第 359 页中提供的示例类似的示例,即第 361 页上的结果图类。

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

当我尝试实例化"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;
}

这是派生上的可怕钻石的一个案例。

ProductionModelNode 有两个Node父级,一个来自 ProductionNode 实现,另一个来自ModelNode不是。

可能的"试用"解决方案:

  • ModelNode中删除继承
  • ProductionModelNode中实施clearappend
  • 使用虚拟继承

使用虚拟继承的示例:

class ProductionNode : virtual public Node
...
class ModelNode: virtual public Node

当您定义带有= 0符号的方法时(例如:virtual void reverse() = 0; (,这意味着该方法定义为纯虚拟

必须在从包含"纯虚拟"方法的类派生的每个类中实现每个"纯虚拟"方法。(在您的情况下Node类(。

class ProductionModelNode : public ModelNode, public ProductionNode { public: ... virtual void clear() override { //implementation } virtual void append(const std::string&) override { //implementation } ... }