【问题标题】:Versions of the same class with different inheritance具有不同继承的同一类的版本
【发布时间】:2017-04-18 14:59:27
【问题描述】:

我正在使用具有两个大型继承树的数学软件框架。这在概念上受到启发:一种用于一般函数(它们继承自 Func),一种用于归一化概率密度函数(它们继承自 Pdf)。

但是,原则上有些类应该存在于两个层次结构中,例如,Gauss 函数。

目前,有一个GaussFunc 和一个GaussPdf 类具有相同的源代码实现,除了类名和分别从FuncPdf 继承。

我想通过删除源代码的第二个副本来改善这种情况。我可以想出几种方法来解决这个问题而不会弄乱整个继承树,例如将预处理器宏与#include 语句或模板结合使用,但我不确定什么是最明智的做法在这种情况下。

非常欢迎任何关于如何在这种情况下进行的建议。但是,请注意,我不能重组整个软件项目来避免这个问题先验(这当然是最理智的方法,但在我的工作时间范围内是不可能的,也不在我被允许决定的事情范围内大约)。

【问题讨论】:

  • 这听起来像是对继承的滥用。没有源代码很难说。
  • 听起来 Pdf 不应该是单独的层次结构,而是一些适配器(基于模板?)用于主层次结构
  • @imreal:源代码的哪些细节会很有趣?该类的整个源代码约为 2000 行,因此将其全部粘贴有点超出了我假设的范围:-)
  • @Swift:是的,那样会更好。但就目前而言,我仍然坚持现状。
  • 某些东西提供了为什么类需要继承的线索。如果它不依赖于其父类的(Funcpdf)接口,或者它们也具有相同的实现,那么问题可能在层次结构上更高。

标签: c++ templates inheritance include c-preprocessor


【解决方案1】:

只需将要继承的类模板化,如下所示:

template<typename Base>
class MetaGauss : public Base
{
    ...
};

typedef MetaGauss<Func> GaussFunc;
typedef MetaGauss<Pdf> GaussPdf;

这是一个现场演示:

http://ideone.com/XD4E6y

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2022-01-10
    • 2011-04-07
    • 1970-01-01
    • 2012-09-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多