Приветствия все,C++ Множественное наследование с интерфейсами?
Я пришел из фона Java, и у меня возникли трудности с множественным наследованием.
У меня есть интерфейс под названием IView, который имеет метод init(). Я хочу получить новый класс, называемый PlaneViewer, реализующий выше интерфейс и расширяющий другой класс. (QWidget).
Моя реализация как:
IViwer.h (только заголовок файла, не CPP файл):
#ifndef IVIEWER_H_
#define IVIEWER_H_
class IViewer
{
public:
//IViewer();
///virtual
//~IViewer();
virtual void init()=0;
};
#endif /* IVIEWER_H_ */
Мой производный класс.
PlaneViewer.h
#ifndef PLANEVIEWER_H
#define PLANEVIEWER_H
#include <QtGui/QWidget>
#include "ui_planeviewer.h"
#include "IViewer.h"
class PlaneViewer : public QWidget , public IViewer
{
Q_OBJECT
public:
PlaneViewer(QWidget *parent = 0);
~PlaneViewer();
void init(); //do I have to define here also ?
private:
Ui::PlaneViewerClass ui;
};
#endif // PLANEVIEWER_H
PlaneViewer.cpp
#include "planeviewer.h"
PlaneViewer::PlaneViewer(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
PlaneViewer::~PlaneViewer()
{
}
void PlaneViewer::init(){
}
Мои вопросы:
- Нужно объявить метод Init() в интерфейсе PlaneViewer также, поскольку он уже определен i n IView?
2.Я не Скомпилируйте выше кода, дают ошибку:
PlaneViewer] + 0x28): неопределенная ссылка на `TypeInfo для IViewer» collect2: л.д. возвращается статус 1 выхода
У меня есть иметь реализацию для IView в CPP-файле (потому что все, что я хочу, это интерфейс, а не как реализация)?
Могу ли я спросить о вашем дизайне? Зачем вам нужно связывать QWidget и IViewer в одной иерархии наследования? Какую проблему вы пытаетесь решить с помощью множественного наследования? Я прошу, потому что множественное наследование полезно в нескольких редких ситуациях, но часто проблемы лучше решаются по-другому. –
В моем приложении есть несколько типов зрителей, которые используют одни и те же данные. (3D-данные вокселя) .Eg: 2D-зрители (плоскость XY, плоскость YZ, плоскость ZX) и 3D-просмотрщик. И в будущем theres станут еще более зрителями. QWiget должен использовать рисование и рендеринг данных. IView - абстрактный класс/интерфейс для объявления командных методов и данных для всех типов зрителей. –