更改现有派生类的基类

时间:2013-09-04 09:32:11

标签: c++

目前我正在编写一个将水平测量数据显示在某些图表中的应用程序。我总是在x轴上有日期/时间,在y轴上有数据。我使用Qwt来修改QwtPlotPicker类以显示正确的时间标签。我通过派生和重新定义成员函数来做到这一点:

class myQwtPlotPicker : public QwtPlotPicker {
Q_OBJECT

public:
  explicit myQwtPlotPicker( QWidget* canvas, bool DateScale = false );
  explicit myQwtPlotPicker( int xAxis, int yAxis, QWidget* canvas, bool DateScale = false );
  explicit myQwtPlotPicker( int xAxis, int yAxis, RubberBand rubberBand, DisplayMode trackerMode, QWidget* canvas, bool DateScale = false );
  virtual ~myQwtPlotPicker() {};

protected:
  virtual QwtText trackerTextF( const QPointF &position ) const {
    ... redefinition of the label text ...
  }

};

如您所见,我还添加了一个新参数DateScale,可以打开或关闭日期标签。这非常有效,但有一个QwtPlotZommer类,它源于QwtPlotPicker:

class QWT_EXPORT QwtPlotZoomer: public QwtPlotPicker { };

现在,问题是,如何让QwtPlotZommer类从myQwtPlotPicker派生而不是从QwtPlotPicker派生? 或者当然我可以编辑Qwt源,但必须有一个正确的方法来做到这一点。

我希望有一个正确的方法来做到这一点。如果有人能帮助我,我会很高兴。

4 个答案:

答案 0 :(得分:2)

尝试多重继承:

class myQwtPlotZoomer : public QwtPlotZoomer, public QwtPlotPicker { };

答案 1 :(得分:1)

在C ++中无法在运行时更改类层次结构。

答案 2 :(得分:1)

我想您应该重新考虑您的设计 - 您不能也不应该更改某些库类的继承层次结构。

您是否看过一些示例,看看您提到的课程是如何使用的?也许您应该问一个新问题,找出如何解决您实际面临的问题(例如,如果我理解正确,如何在qwt中创建可缩放的图表)

答案 3 :(得分:0)

你必须重载QwtPlotZoomer重新实现trackerTextF()。如果你还有一个独立的QwtPlotPicker的用例 - 不是QwtPlotZoomer - 你必须做两次:

类YourPicker:public QwtPlotPicker ... class YourZoomer:public QwtPlotZoomer ...

由于你的实现是单行的,我没有看到写两次的问题,但是如果你想避免这种情况,你必须将代码放到其他类中,这在两个重载方法中都被调用。