c++ - 如何在 C++ 中同时子类化多个类?

标签 c++ oop derived-class

我有三个彼此紧密耦合的类(class),我想同时专攻这三个类(class)。三个派生类应该使用与父类(super class)相同的接口(interface)相互通信,再加上我将在派生版本中添加的一些额外接口(interface)。有没有一种合理的模式可以用来在 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 的 vector ,FindValue 应该返回一个 CNewValue 引用等。同样,CGraph 在其定义中引用 CSeries,但 CNewGraph 应该使用 CNewSeries。

最佳答案

一种可能性是根据值类型对 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 */
};

对于只有三个类(class),这还不算太糟糕,但我可以想象如果你有更多的类(class)需要与 CSeries 交谈,这会很快变得很麻烦。

关于c++ - 如何在 C++ 中同时子类化多个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735564/

相关文章:

c++ - 哎呀沮丧

c++ - 使用 C++ 和修改基类的私有(private)/保护属性

c++ - 段错误(核心转储)- 具有多维 vector 的循环 C++98

c++ - 从父类向下转换元素

python - 类没有属性X

c++ - 从派生类构造函数调用基类构造函数

c++ - 使用派生类指针从基类析构函数调用非虚拟基类成员函数是否安全?

c++ - "natural_alignment_of"类型特征?

C++ 开普勒和牛顿定律

javascript - 将值从输入传递到返回对象的构造函数