Chúc mừng tất cả,C++ Nhiều kế thừa với giao diện?
Tôi đến từ nền Java và tôi gặp khó khăn với đa kế thừa.
Tôi có một giao diện được gọi là IView có phương thức init(). Tôi muốn lấy một lớp mới có tên là PlaneViewer triển khai giao diện trên và mở rộng một lớp khác. (QWidget).
thực hiện của tôi là như sau:
IViwer.h (chỉ tập tin Header, không có tập tin CPP):
#ifndef IVIEWER_H_
#define IVIEWER_H_
class IViewer
{
public:
//IViewer();
///virtual
//~IViewer();
virtual void init()=0;
};
#endif /* IVIEWER_H_ */
lớp được thừa kế của tôi.
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(){
}
Câu hỏi của tôi là:
- Có cần phải khai báo phương pháp init() trong giao diện PlaneViewer cũng bởi vì nó đã được định nghĩa rồi n IView?
2.I không thể complie trên mã, đưa ra báo lỗi:
PlaneViewer] + 0x28): tài liệu tham khảo không xác định cho `typeinfo cho IViewer' collect2: ld trở về 1 trạng thái thoát
Tôi có để thực hiện cho IView trong tệp CPP (vì tất cả những gì tôi muốn là một giao diện, không phải là triển khai)?
Tôi có thể hỏi về thiết kế của bạn không? Tại sao bạn cần phải liên kết với nhau QWidget và IViewer trong cùng một hệ thống phân cấp thừa kế? Bạn đang cố gắng giải quyết vấn đề gì với nhiều thừa kế? Tôi hỏi vì đa thừa kế là hữu ích trong một vài trường hợp hiếm gặp nhưng thường các sự cố được giải quyết tốt hơn theo cách khác. –
Trong ứng dụng của tôi có một số loại người xem có cùng dữ liệu. (Dữ liệu voxel 3D) .Eg: người xem 2D (máy bay XY, Máy bay YZ, Máy bay ZX) và trình xem 3D. Và trong tương lai sẽ có thêm một số người xem. QWiget là sử dụng bản vẽ và hiển thị Dữ liệu. IView là một lớp/giao diện trừu tượng để khai báo các phương thức và dữ liệu lệnh cho tất cả các kiểu người xem. –