2015-03-23 6 views
1

Я новичок в C++, но у меня есть опыт программирования на языках высокого уровня (Java и т. Д.). Основная проблема, с которой я сейчас сталкиваюсь, заключается в понимании наследования и интерфейсов в C++.Выполнение интерфейса Inherit

testsurface.h

#include <QSurface> 

class TestSurface : public virtual QSurface 
{ 
public: 
    TestSurface(SurfaceClass clazz) : QSurface(clazz) { } 
    ~TestSurface() { } 

    virtual QSurfaceFormat  format()  = 0; 
    virtual QSize    size()   = 0; 
    virtual QPlatformSurface* surfaceHandle() = 0; 
    virtual SurfaceType   surfaceType() = 0; 
}; 

testwindow.h

#include <QWindow> 
#include "testsurface.h" 

class TestWindow : public QWindow, public TestSurface 
{ 
public: 
    TestWindow() : QWindow(), TestSurface(QWindow::Window) { } 
    ~TestWindow() { } 
}; 

В моем понимании, TestSurface проходит все абстрактные методы от QSurface вдоль. Из-за TestWindow наследуется QWindow который наследующий QSurface я бы ожидать, что все необходимые методы TestSurface::QSurface реализуются через TestWindow::QWindow, но это не так, потому что я получаю следующее сообщение об ошибке: При строительстве

C2512: C:\...\Qt\Projects\Test2\testwindow.h:10: Erroe: C2512: 'QSurface::QSurface': no appropriate default constructor available 

и

C:\...\Qt\Projects\Test2\main.cpp:12: Error: C2259: 'TestWindow': Instance of abstract class can't be created because of following members: 
"QSurfaceFormat TestSurface::format(void)": is abstract 
    c:\...\qt\projects\test2\testsurface.h(12): See declaration of 'TestSurface::format' 
"QSize TestSurface::size(void)": is abstract 
    c:\...\qt\projects\test2\testsurface.h(13): See declaration of 'TestSurface::size' 
"QPlatformSurface *TestSurface::surfaceHandle(void)": is abstract 
    c:\...\qt\projects\test2\testsurface.h(14): See declaration of 'TestSurface::surfaceHandle' 
"QSurface::SurfaceType TestSurface::surfaceType(void)": is abstract 
    c:\...\qt\projects\test2\testsurface.h(15): See declaration of 'TestSurface::surfaceType' 
"QSurfaceFormat QSurface::format(void) const": is abstract 
    D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(67): See declaration of 'QSurface::format' 
"QPlatformSurface *QSurface::surfaceHandle(void) const": is abstract 
    D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(68): See declaration of 'QSurface::surfaceHandle' 
"QSurface::SurfaceType QSurface::surfaceType(void) const": is abstract 
    D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(70): See declaration of 'QSurface::surfaceType' 
"QSize QSurface::size(void) const": is abstract 
    D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(73): See declaration of 'QSurface::size' 

ответ

3

Это не сработает, QWindow не использует виртуальное наследование при наследовании QSurface.

class Q_GUI_EXPORT QWindow : public QObject, public QSurface {...}; 

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

  Base 
      /\ 
     / \ 
    virtual/ \ virtual 
    Der1   Der2 
      \ /
      \ /
      \/
      Join 
+0

Хм, хорошо, я это вижу. Но если я хочу сохранить свою настройку, тогда мне придется обернуть реализацию QWindow :: QSurface. Как 'QSize TestWindow :: size() {return QWindow :: size(); } ', но вот проблема:' QWindow :: surfaceHandle() 'является приватным в' QWindow'. Похоже, я не могу делать то, что хотел. –

+1

@BastiFunck - вы можете получить дескриптор 'QPlatformWindow' через' QWindow :: handle() ',' QPlatformWindow' наследует 'QPlatformSurface', который имеет public' QSurface * surface() const', если получить поверхность - это то, что вам нужно , – dtech

+0

Теперь, когда я знаю, что мне нужно идти с завершением реализации, это было бы следующим шагом, чтобы узнать, как получить дескриптор QWindow. Спасибо, что сэкономил мне время на поиск в Google –