更改现有派生类的基类

Change base class of existing derivated class

本文关键字:基类 派生      更新时间:2023-10-16

目前我正在编写一个应用程序,该应用程序将液位测量数据显示在一些图中。我总是在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派生,而不是从QwtPlotPixer派生?当然,我也可以编辑Qwt来源,但必须有一个合适的方法。

我希望有一个合适的方法来做这件事。如果有人能帮我,我会很高兴的。

尝试多重继承:

class myQwtPlotZoomer : public QwtPlotZoomer, public QwtPlotPicker { };

在C++中,没有办法在运行时更改类层次结构。

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

你有没有看一些例子,看看你提到的类是如何使用的?也许你应该问一个新问题,以了解如何解决你实际面临的问题(即,如果我理解正确,如何在qwt中创建可缩放的绘图)

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

class YourPicker:公共QwtPlotPicker。。。class YourZoomer:公共QwtPlotZoomer。。。

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