Qt/C++中多重继承的正确方法是什么?

Ash*_*iya 12 c++ qt qt4 multiple-databases

在我的Qt应用程序中,我有一个基类如下.我正在使用QObject,因为我想在所有派生类中使用Signal-Slot机制.

class IRzPlugin : public QObject {

public:
  virtual void registerMenu(QWidget*);
  virtual void execute();
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个课程如下.我需要从QWidget扩展,因为我需要在所有派生类中实现事件处理方法.(mouseMoveEvent(),keyPressEvent().. etc);

class IRzLayeringPlugin : public IRzPlugin , public QWidget{

}
Run Code Online (Sandbox Code Playgroud)

但编译器给出了这些错误:

C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const':
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1
Run Code Online (Sandbox Code Playgroud)

Cal*_*itt 7

在当前的版本中,不可能QObject在派生类(如您的IRzLayeringPlugin类)的多个继承路径中使用.我见过的唯一解决方案是创建一个没有任何QObject继承的接口类,但是使用与QObject您想要使用的函数直接对应的函数,然后QObject在特定类中实现接口和其他类继承之间的桥接.它很快就变丑了.


Ven*_*emo 7

今天在这里也有类似的问题.

基本上,需要两件事:

  • Q_DECLARE_INTERFACE在接口类声明后添加
  • 将接口添加到Q_INTERFACES类的宏

在此之后,qobject_cast将与您的接口一起使用.

如果您想使用接口中的信号和插槽,那么您运气不好,因为您只能使用从QObject派生的类型.但在这种情况下,你总是会得到'QObject' is an ambiguous base of 'IRzLayeringPlugin'错误.

在这种情况下,@ Caleb的想法仍然是最好的.