Изменить базовый класс существующего производного класса

На данный момент я пишу приложение, которое отображает данные измерения уровня на некоторых графиках. У меня всегда есть дата / время по оси 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, но должен быть правильный способ сделать это.

Я надеюсь, что есть правильный способ сделать это. Я был бы рад, если бы кто-то мог помочь мне с этим.

0

Решение

Вы должны перегрузить QwtPlotZoomer, переопределив trackerTextF (). Если у вас также есть вариант использования автономного QwtPlotPicker — не являющегося QwtPlotZoomer — вы должны сделать это дважды:

класс YourPicker: общедоступный QwtPlotPicker …
класс YourZoomer: общедоступный QwtPlotZoomer …

Поскольку ваша реализация является однострочной, я не вижу проблемы в ее написании дважды, но если вы хотите избежать этого, вы должны поместить код в какой-то другой класс, который вызывается в обоих перегруженных методах.

0

Другие решения

Попробуйте множественное наследование:

class myQwtPlotZoomer : public QwtPlotZoomer, public QwtPlotPicker { };
2

Нет способа изменить иерархию классов во время выполнения в C ++.

1

Я полагаю, что вам следует пересмотреть свой дизайн — вы не можете и не должны изменять иерархию наследования некоторого библиотечного класса.

Вы смотрели на некоторые примеры, чтобы увидеть, как упомянутые классы предназначены для использования? Возможно, вам следует задать новый вопрос, чтобы узнать, как решить проблему, с которой вы на самом деле сталкиваетесь (т.е. как создать масштабируемый график в qwt, если я вас правильно понимаю)

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector