如何在C++中同时对几个类进行子类划分
How can I simultaneously subclass several classes in C++?
我有三个彼此紧密耦合的类,我想同时专门化这三个类。这三个派生类应该使用与超类相同的接口,加上我将在派生版本中添加的一些额外接口来相互通信。有没有一个合理的模式可以用来在C++中实现这种"同时派生"关系?
更具体地说:我正在扩展一个显示和编辑图形的UI组件。涉及三个类别:
- CGraph,UI小部件本身
- C系列,保存数据并由CGraph操作
- CValue,表示系列中的一个值,其列表由C系列所有
我计划添加派生类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
我遇到的问题是,例如,C系列在其定义中引用了CValue:
class CSeries
{
public:
CValue & FindValue(/* stuff */);
private:
vector<CValue> m_values;
};
在CNewSeries中,它应该是CNewValue的向量,FindValue应该返回CNewValue引用等。类似地,CGraph在其定义中引用了CSeries,但CNewGraph应该使用CNewSeries。
一种可能性是基于值类型对C系列进行模板化。然后,您可以创建一个派生类,指定要使用的特定值类型,如果不需要其他成员,甚至可以创建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现在不是从C系列派生的。这意味着任何其他使用C系列的产品都无法无缝使用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 */
};
对于只有三个类,这还不错,尽管我可以想象,如果有更多的类需要与C系列对话,它会变得很麻烦。
相关文章:
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何返回或护理项目清单基于几个类别
- 我们如何在文本文件中找到C++中的几个单词?
- 关于 std::bitset 构造函数的几个问题?
- 几个 Nt 函数在 Windows 7 x32 上返回STATUS_WAIT_0
- std::stoi 只转换前几个字符
- C++ 通过接口使用从其他几个类继承的类
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 我有几个关于参考变量的问题
- 如何将几个变量复制到其他变量
- 如何在新设计中迁移需要几个额外参数的函数
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- 如何在几个空行后打印文件中的输出
- recvfrom 只收到几个数据包,之后它进入等待状态
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- C++ 两个线程,共享几个整数变量
- 在循环中使用字符串流从几个字符串中提取数字
- 如何在C++中同时对几个类进行子类划分