首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于C++多重继承的困惑

关于C++多重继承的困惑
EN

Stack Overflow用户
提问于 2016-06-22 10:50:01
回答 6查看 1.6K关注 0票数 5

我对C++的更高级特性有些陌生。昨天,我发布了以下问题,我了解了虚拟遗产和可怕的死亡钻石。

从接口和实现C++继承

我还通过其他链接了解到,多重继承通常是一个糟糕的代码设计的标志,同样的结果通常可以在不使用MI的情况下更好地实现。问题是..。对于下面的问题,我不知道什么是更好的单继承方法。

我想为两种类型的数字点定义一个接口。输入数字点和输出数字点。接口应该很细,只有访问信息所需的内容。当然,绝大多数属性对于两种类型的数字点都是共同的。所以对我来说,这是一个明确的继承案例,而不是构图。

我的界面定义是这样的:

代码语言:javascript
复制
// Interface Definitions
class IDigitalPoint
{
public:
  virtual void CommonDigitalMethod1() = 0;
};

class IDigitalInputPoint : virtual IDigitalPoint
{
public:
  virtual void DigitialInputMethod1() = 0;
};

class IDigitalOutputPoint : virtual IDigitalPoint
{
public:
  virtual void DigitialOutputMethod1() = 0;
};

我的实现如下所示:

代码语言:javascript
复制
// Implementation of IDigitalPoint
class DigitalPoint : virtual public IDigitalPoint
{
public:
  void CommonDigitalMethod1();
  void ExtraCommonDigitalMethod2();
}

// Implementation of IDigitalInputPoint
class DigitalInputPoint : public DigitalPoint, public IDigitalInputPoint 
{
public:
  void DigitialInputMethod1();
  void ExtraDigitialInputMethod2();
}

// Implementation of IDigitalOutputPoint
class DigitalOutputPoint : public DigitalPoint, public IDigitalOutputPoint 
{
public:
  void DigitialOutputMethod1();
  void ExtraDigitialOutputMethod2();
}

那么,我如何才能重新格式化这个结构,以避免MI?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-06-22 11:10:15

“多重继承通常是错误代码设计的标志”--对于此规则,纯接口的父级不算在内。您的I*类是纯接口(只包含纯虚拟函数),因此Digital*Point类在这方面是可以的。

票数 7
EN

Stack Overflow用户

发布于 2016-06-22 12:00:13

(多重)继承和接口往往会导致不必要的简单关系的复杂。

在这里,我们只需要一个简单的结构和很少的独立功能:

代码语言:javascript
复制
namespace example {
    struct Point { T x; T y; }

    Point read_method();
    void write_method(const Point&)
    void common_method(Point&);
    void extra_common_method(Point&);
} // example

common_method可能是点的成员函数的候选。extra_common_method并不常见,它可能是另一个封装Point的类的候选对象。

票数 1
EN

Stack Overflow用户

发布于 2016-06-22 11:03:02

这正是标准库在std::basic_iostream层次结构中确实使用虚拟继承的情况。

因此,这可能是真正有意义的罕见情况。

然而,这完全取决于您为清晰起见删除的详细信息,因此不可能确定是否存在更好的解决方案。

例如,为什么输入点与输出点不同?DigitalPoint听起来就像一个有属性的东西,可以用类来建模。不过,DigitalInputPoint听起来就像.以某种方式耦合到输入源的DigitalPoint。它有不同的属性吗?不同的行为?他们是什么?为什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37965835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档