7

由于 QObject,我在使用 QT 时遇到了关于多重继承的问题。我知道很多其他人有同样的问题,但我不知道我应该如何解决它。

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 从 QObject 继承是因为信号。有没有办法做到这一点?

编辑:

将 virtual 添加到每个继承声明中,仍然给我同样的错误:

class NavigatableItem : public virtual QObject

class Button : public virtual NavigatableItem, public virtual QToolButton

class MainMenuOption : public virtual Button

即使在“全部清理”、“运行 qmake”和“全部构建”之后。

4

3 回答 3

8

它需要更多的代码,但我过去所做的是使其中一个(NavigatableItem在这种情况下是你的)成为纯虚拟类,即接口。不要使用“信号”宏,而是让它们成为纯虚拟保护函数。然后从您的 QObject 派生类以及接口乘以继承,并实现这些方法。

我知道这有点争议,但不惜一切代价避免多重实现继承确实解决了许多问题和混乱。Google C++ Style Guidelines推荐这个,我认为这是个好建议。

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();
        ...
}
于 2011-03-23T12:48:08.010 回答
0

使用虚拟继承,例如

class X : public virtual Y 
{
};

class Z : public virtual Y
{
};

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

将只有一个基类 Y 的副本

于 2011-03-23T10:39:35.803 回答
0

您应该使用虚拟继承。

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
于 2011-03-23T14:07:22.267 回答