Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从单独的动态库检查Qt元对象继承_C++_Qt_Inheritance_Shared Libraries - Fatal编程技术网

C++ 从单独的动态库检查Qt元对象继承

C++ 从单独的动态库检查Qt元对象继承,c++,qt,inheritance,shared-libraries,C++,Qt,Inheritance,Shared Libraries,我正在创建一组具有公共基类型的Qt插件。应用程序加载一个插件,并根据它所属的基类型对它提供的类进行分类 基本类型包含在静态库中,派生类型内置在包含静态库的插件中,应用程序还链接到静态库 简而言之,这看起来像: 静态库(通用) class Base1:公共QObject{ Q_对象 }; //Qt moc代码生成: //常量QMetaObject Base1::staticMetaObject={&QObject::staticMetaObject,/*etc*/}; 类BasePlugin{ 公

我正在创建一组具有公共基类型的Qt插件。应用程序加载一个插件,并根据它所属的基类型对它提供的类进行分类

基本类型包含在静态库中,派生类型内置在包含静态库的插件中,应用程序还链接到静态库

简而言之,这看起来像:

静态库(通用)
class Base1:公共QObject{
Q_对象
};
//Qt moc代码生成:
//常量QMetaObject Base1::staticMetaObject={&QObject::staticMetaObject,/*etc*/};
类BasePlugin{
公众:
虚拟QObject*getObject()=0;
};
共享库(插件)
class-Derived1:public-Base1{
Q_对象
};
//Qt moc代码生成:
//常量QMetaObject Derived1::staticMetaObject={&Base1::staticMetaObject,/*etc*/};
类Derived1Plugin:publicQObject,publicBasePlugin{
Q_对象
公众:
QObject*getObject(){返回新的Derived1;}
};
应用
//安装插件加载程序,加载插件
QObject*pluginObj=plugin.instance();
qDebug()超类()//显示两个不同的

通过使用和宏,我得到了一种稍微复杂一些的工作方法

上的文档解释了这些宏的使用,但并非所有的插件机制都是动态强制转换工作所必需的

class BaseInterface
{
public:
  virtual ~BaseInterface() {}
  virtual void foo() = 0;
};

Q_DECLARE_INTERFACE( BaseInterface, "org.example.BaseInterface" )

class Base1 : public QObject, public BaseInterface
{
   Q_OBJECT
   Q_INTERFACES( BaseInterface )
public:
   virtual void foo() override {}
};
您现在应该能够使用
qobject\u cast(pluginObj)
进行强制转换

理论上,您也可以将
Base1
本身定义为接口,并将
Q_INTERFACES(Base1)
添加到
Derived1
的声明中,但我在尝试这样做时遇到,另外,这意味着继承
Base1
的每个类必须记住添加该宏。

声称
qobject\u cast
应该跨动态库边界工作,但我遇到了与您相同的问题。