Saludos a todos,C++ ¿Herencia múltiple con interfaces?
Vengo del fondo de Java y estoy teniendo dificultades con la herencia múltiple.
Tengo una interfaz llamada IView que tiene el método init(). Quiero derivar una nueva clase llamada PlaneViewer que implementa la interfaz anterior y extender otra clase. (QWidget).
Mi aplicación es como:
IViwer.h (sólo archivo de cabecera, hay un archivo CPP):
#ifndef IVIEWER_H_
#define IVIEWER_H_
class IViewer
{
public:
//IViewer();
///virtual
//~IViewer();
virtual void init()=0;
};
#endif /* IVIEWER_H_ */
Mi clase derivada.
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(){
}
Mis preguntas son:
- ¿Es necesario declarar método init() en la interfaz PlaneViewer también, porque ya está definido n IView?
2.I no puede complie código anterior, dará error:
PlaneViewer] + 0x28): undefined reference to `typeinfo para iViewer' collect2: ld devolvió el código de salida 1
¿Tengo tener implementación para IView en el archivo CPP (porque todo lo que quiero es una interfaz, no como implementación)?
¿Puedo preguntar acerca de su diseño? ¿Por qué necesita unir QWidget e IViewer en la misma jerarquía de herencia? ¿Qué problema estás tratando de resolver con herencia múltiple? Lo pregunto porque la herencia múltiple es útil en algunas situaciones raras, pero a menudo los problemas se resuelven mejor de una manera diferente. –
En mi aplicación hay varios tipos de espectadores que comparten los mismos datos (datos voxel 3D) .Eg: visores 2D (plano XY, plano YZ, plano ZX) y un visor 3D. Y en el futuro habrá más espectadores. QWiget utilizará el dibujo y la representación de Datos. IView es una clase/interfaz abstracta para declarar métodos de comando y datos para todo tipo de espectadores. –