【发布时间】:2018-07-25 18:41:44
【问题描述】:
假设我有以下玩具界面:
class iTest{
virtual ~iTest(void) = 0;
virtual void doA(void) = 0;
virtual void doB(void) = 0;
}
Q_DECLARE_INTERFACE(iTest, "somestring")
我想在两个类中实现它:Base 和 Derived。
class Base : public QObject, public iTest
{
Q_OBJECT
Q_PLUGIN_METADATA (IID "somestring")
Q_INTERFACES(iTEST)
explicit Base(QObject* parent=0);
void doA(void); // do common thing all derived need do
int data; // some data member all derived should have
}
class Derived: public Base
{
Q_OBJECT
Q_PLUGIN_METADATA (IID "somestring")
Q_INTERFACES(iTEST)
explicit Derived(QObject* parent = 0);
void doB(); // do something custom dervived objects need do
}
我的错误推理告诉我这应该有效。插件的抽象基类为接口的一部分提供功能,而派生类构成接口的其余部分。我可以通过一些明智的删除宏(基类元数据宏)来编译它。但是,生成的插件不会加载。所以我认为我的推理有问题,有经验的 Qt 开发人员或 c++ 开发人员可能会指出我看不到。
【问题讨论】:
-
所有这些
Q_宏都由MOC 编译器处理,并将某些功能绑定到C++ 对象的一个实例。我们同时拥有Base和Derived来“竞争”与一个实例相关的相同隐式功能。那时我不会做这样的 Qt 类设计。我宁愿从目标类中公开一次插件接口,但我们可以根据需要尽可能多的 iTest 子级。而且我们可以有很多目标插件,为什么不呢。这不是最终的答案,我自己想听听智者的意见。
标签: c++ qt multiple-inheritance qtplugin