对象多重继承
QObject Multiple Inheritance
我正在尝试使用c++/Qt的混合类来提供一大堆具有公共接口的小部件。接口的定义方式是这样的,如果它被定义为其他小部件类的基类,那么小部件本身将具有这些信号:
class SignalInterface: public QObject {
Q_OBJECT
public:
SignalInterface();
virtual ~SignalInterface();
signals:
void iconChanged(QIcon);
void titleChanged(QString);
}
class Widget1: public SignalInterface, QWidget{
public:
Widget1()
virtual ~Widget1()
// The Widget Should Inherit the signals
}
查看类层次结构问题变得明显,我偶然发现了多重继承中的可怕钻石,其中Widget1
继承自QWidget
和SignalInterface
,并且两者都继承自QObject
。这会引起什么问题吗?
我们知道,如果QObject
类是纯虚的,这个问题可以很容易地解决(事实并非如此)。
一个可能的解决方案是:
class Interface: public QWidget {
Q_OBJECT
signals:
void IconChanged(QIcon);
void titleChanged(QString);
}
class Widget1: public Interface {
}
这里的问题是,我已经有很多从QWidget
继承的代码,它的痛苦的破解。还有别的办法吗?
不幸的是,继承QObject
两次将导致moc
出现问题。
:
如果您正在使用多重继承,moc假定第一个继承的类是QObject的子类。另外,请确保只有第一个继承的类是QObject。
我建议使用更像委托模式的东西,或者使用HasA而不是IsA关系重新创建。
Qt允许多重继承,如果基类从QObject私有继承。
的例子:
class Base: private QObject {
Q_OBJECT
/*Can use signals and slots like any other QObject-derived class*/
};
class Derived1: public Base {
/*Cannot use signals/slots because it does not "see" that Base inherits from QObject*/
};
class Derived2: public QWidget, public Base {
Q_OBJECT
/*Can use signals/slots plus has all the functionality of QWidget and Base*/
};
当然,私有继承是完全不同的动物,可能不会给你真正需要的解决方案。我使用它的原因是当我只能在基类中使用信号/插槽时。当我真的需要QObject
行为的派生类,我从QObject
继承专门为该类。
为什么使用继承,为什么不使用组合?例如,您可以用下面的方式重写案例:
class IMyWidgetSignals : public QObject
{
Q_OBJECT
signals:
void iconChanged(QIcon);
void titleChanged(QString);
};
//------------------------------------------------------------------------------
class IMyWidget {
public:
IMyWidget () {}
// virtual functions:
// ...
IMyWidgetSignals _signals;
};
//------------------------------------------------------------------------------
class Widget1: public QWidget, public IMyWidget
{
public:
using QWidget::QWidget;
}
//------------------------------------------------------------------------------
int main(...)
{
Widget1 w1;
w1.show();
QObject::connect(&w1._signals, &IMyWidgetSignals::iconChanged, [] (const auto &icon) {
// ... do smth with icon
});
}
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 使用智能指针附加的继承对象的深层复制
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- C++两次从文件保存对象读取多重继承
- 多级/多重继承期间的对象大小
- 多重继承期间的对象构造和虚拟指针
- 对象多重继承
- 为什么多重继承会增加对象的大小,尽管基基是空的
- 如何在使用Visual Studio 编译器使用多重继承时优化对象的内存大小?
- 虚拟析构函数和删除具有多重继承的对象..它是如何工作的
- 多级/多重继承期间对象的大小