我正在尝试解决涉及 C++ 中的并行继承的问题。我为此找到的最接近的问题是并行继承树,其中一棵树的类具有另一棵树的类的容器,但它并不能完全回答我的问题。
我有一个模型,由三个类组成:Model、Trainer、InstanceProcessor (IP),分别包含模型数据、训练函数和模型处理代码。现在我有这个模型的大约 10 个不同版本,有很多代码重叠但有些差异,创建了某种形式的并行继承:
Model - ModelA, ModelB, ModelC, ...
Trainer - TrainerA, TrainerB, TrainerC
IP - IPA, IPB, IPC
在代码主体中,我使用 Model* 指针根据解析的参数访问特定模型。
Model 和 Trainer 都需要多个短暂的 IP 实例,Model 还需要一个永久的 Trainer 实例。
我当前的实现使用三个带有一些虚函数的基类,然后对从这些基类继承的特定类进行建模。这需要我使用大量的铸造(例如,从 model.h 中的 Trainer* trainer 到 TrainerA 以满足特定需求)。
我怀疑有一种更优雅的实现方式(使用模板/接口?),并且想知道是否有人可以指出我正确的方向?谢谢!
编辑:为了从下面的答案中澄清一点,其中一个复杂之处在于我想要例如。Trainer 类具有函数 basic_train():
Trainer::basicTraining() {
...
IP* ip = new IP(some args);
ip->doStuff();
...
}
现在在哪里创建适当的 IP,具体取决于使用的培训师的类型。该函数的其余部分不会从 TrainerA 更改为 TrainerB 实例。