如何在C ++中同时子类化几个类?

时间:2012-10-04 20:41:04

标签: c++ oop derived-class

我有三个相互紧密耦合的课程,我想同时专注于这三个课程。这三个派生类应该使用与超类相同的接口相互通信,以及我将在派生版本中添加的一些其他接口。我可以用一种合理的模式在C ++中实现这种“同时派生”关系吗?

更具体一点:我正在扩展一个显示和编辑图形的UI组件。涉及三个类:

  • CGraph,UI小部件本身;
  • CSeries,其中包含数据并由CGraph操作;
  • CValue,表示系列中的一个值,其列表由CSeries拥有。

我计划添加派生类CNewGraph,CNewSeries和CNewValue(占位符名称)。

CGraph     ---views/edits--->  CSeries     ---owns list of--->  CValue
  ^                              ^                                ^
  | is-a                         | is-a                           | is-a
  |                              |                                |
CNewGraph  ---views/edits--->  CNewSeries  ---owns list of--->  CNewValue

我遇到的问题是,例如,CSeries在其定义中引用了CValue:

class CSeries
{
public:
    CValue & FindValue(/* stuff */);
private:
    vector<CValue> m_values;
};

在CNewSeries中,它应该是CNewValue的向量,而FindValue应该返回CNewValue引用等。类似地,CGraph在其定义中引用CSeries,但CNewGraph应该使用CNewSeries。

1 个答案:

答案 0 :(得分:0)

一种可能性是根据值类型来模拟CSeries。然后,您可以创建一个派生类,指定要使用的特定值类型,如果不需要其他成员,甚至可以创建typedef。

template <typename T>
class CSeriesBase
{
public:
    T & FindValue(/* stuff */);
private:
    std::vector<T> m_values;
};

typedef CSeriesBase<CValue> CSeries;

class CNewSeries : public CSeriesBase<CNewValue>
{
    /* additional members */
};

但是,这会破坏继承关系,因此CNewSeries现在不会从CSeries派生。这意味着使用CSeries的任何其他内容都无法无缝使用CNewSeries。特别是,CGraph也需要在这一系列类型上进行模板化。

template <typename T>
class CGraphBase
{
public:
    void SetSeries(T * pSeries);
private:
    T * m_pSeries;
};

typedef CGraphBase<CSeries> CGraph;

class CNewGraph : public CGraphBase<CNewSeries>
{
    /* additional members */
};

对于只有三个班级,这并不算太糟糕,但我可以想象,如果你有更多的课程需要与CSeries交谈,那么它很匆忙。