I\'m having a problem with QT regarding multiple enheritance because of QObject. I know that a lot of others have the same problems but I don\'t know how I should fix it.
<Use virtual inheritence, e.g.
class X : public virtual Y
{
};
class Z : public virtual Y
{
};
class A : public virtual X, public virtual Z
{
};
will only have one copy of the base class Y
You should use virtual inheritance.
see http://en.allexperts.com/q/C-1040/virtual-inheritance.htm
Seems like you are experiencing the diamond issue, see also:
http://www.cprogramming.com/tutorial/virtual_inheritance.html
Do it like this:
class NavigatableItem : public virtual QObject
class Button : public virtual NavigatableItem, public virtual QToolButton
class MainMenuOption : public Button
It requires a bit more code, but what I have done in the past is make one of them (your NavigatableItem
in this case) a pure virtual class, i.e. interface. Instead of using the "signals" macro, make them pure virtual protected functions. Then multiply-inherit from your QObject-derived class as well as the interface, and implement the methods.
I know it is somewhat controversial, but avoiding multiple implementation inheritance at all costs does solve a host of problems and confusion. The Google C++ Style Guidelines recommend this, and I think it is good advice.
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();
...
}