Qt множественное наследование и сигналы

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

class NavigatableItem : public QObject
{
    Q_OBJECT

    signals:
        void deselected();
        void selected();
        void activated();
};

class Button : public NavigatableItem, public QToolButton
{
    Q_OBJECT

    ...
}

class MainMenuOption : public Button
{
    Q_OBJECT

    ...
}

когда я делаю вот так

MainMenuOption* messages = new MainMenuOption();
connect(messages, SIGNAL(selected()), SLOT(onMenuOptionSelected()))

Я получаю ошибку:

QObject "является неоднозначной базой "MainMenuOption"

причина, по которой я позволил NavigatableItem enherit из QObject из-за сигналов. Есть ли способ сделать это?

Edit:

добавление виртуального к каждому объявлению наследования, все еще дает мне ту же ошибку:

class NavigatableItem : public virtual QObject

class Button : public virtual NavigatableItem, public virtual QToolButton

class MainMenuOption : public virtual Button

даже после "очистить все", "запустить qmake" и "построить все".

3 ответов


это требует немного больше кода, но то, что я сделал в прошлом, это сделать один из них (ваш NavigatableItem в этом случае) чистый виртуальный класс, т. е. интерфейс. Вместо использования макроса "сигналы" сделайте их чисто виртуальными защищенными функциями. Затем умножьте наследование от вашего QObject-производного класса, а также интерфейса и реализуйте методы.

Я знаю, что это несколько спорно, но избежать множественного наследования реализации любой ценой решает множество проблем и путаница. The Google C++ Стиль Руководства рекомендую это, и я думаю, что это хороший совет.

class NavigatableItemInterface
{
    // Don't forget the virtual destructor!
    protected:
        virtual void deselected() = 0;
        virtual void selected() = 0;
        virtual void activated() = 0;
};

class Button : public NavigatableItemInterface, public QToolButton
{
    Q_OBJECT
    ...
    signals:
        virtual void deselected();
        ...
}

используйте виртуальное наследование, например

class X : public virtual Y 
{
};

class Z : public virtual Y
{
};

class A : public virtual X, public virtual Z
{
};

будет иметь только одну копию базового класса Y


вы должны использовать виртуальное наследование.

см.http://en.allexperts.com/q/C-1040/virtual-inheritance.htm

похоже, что вы испытываете проблему с алмазами, см. Также:

http://www.cprogramming.com/tutorial/virtual_inheritance.html

делай так:

class NavigatableItem : public virtual QObject
class Button : public virtual NavigatableItem, public virtual QToolButton
class MainMenuOption : public Button