自定义qt类库的导出时,继承虚函数出现链接错误

VS2017 QT5.12
1.父类继承QWidget
2.父类新增虚函数或者重载QWidget的虚函数;
3.子类继承父类
4.导出子类
5.然后在另一个项目导入子类;
6当使用子类构造函数实例化子类时,就会报父类的虚函数链接错误;
明明没有显示调用父类的函数,为什么会去链接父类的函数

sonClass*  son = new sonClass(MainWindow);//实例化子类
错误    LNK2001    无法解析的外部符号 "public: virtual void __cdecl ParentClass::vfun(void)" (?vfun@ParentClass@@UEAAXXZ)

#include <QWidget>
#include "projecttree_global.h"//导入导出宏定义
class ParentClass : public QWidget
{
    Q_OBJECT
public:
    ParentClass(QWidget *parent);
    ~ParentClass();
    virtual void vfun();//此处的任意虚函数【或者重载QWidget的虚函数的普通函数】会引起连接错误,但是并没有在子类对象中显式调用过该虚函数
};

class PROJECTTREE_EXPORT sonClass : public ParentClass
{
    Q_OBJECT
public:
    sonClass(QWidget *parent);
    ~sonClass();
};

试验过有几种办法可以解决报错问题
1.删除父类虚函数

#pragma once

#include <QWidget>
#include "projecttree_global.h"//导入导出宏定义

class ParentClass : public QWidget
{
    Q_OBJECT
public:
    ParentClass(QWidget *parent);
    ~ParentClass();
    //virtual void vfun();//注释掉
};

class PROJECTTREE_EXPORT sonClass : public ParentClass
{
    Q_OBJECT
public:
    sonClass(QWidget *parent);
    ~sonClass();
};

2.将父类也导出导入

#pragma once

#include <QWidget>
#include "projecttree_global.h"//导入导出宏定义

class PROJECTTREE_EXPORT ParentClass : public QWidget//导入导出父类
{
    Q_OBJECT
public:
    ParentClass(QWidget *parent);
    ~ParentClass();
    virtual void vfun();
};

class PROJECTTREE_EXPORT sonClass : public ParentClass
{
    Q_OBJECT
public:
    sonClass(QWidget *parent);
    virtual void vfun();
    ~sonClass();
};

3.在子类中重载父类虚函数

#pragma once

#include <QWidget>
#include "projecttree_global.h"//导入导出宏定义

class  ParentClass : public QWidget
{
    Q_OBJECT
public:
    ParentClass(QWidget *parent);
    ~ParentClass();
    virtual void vfun();
};

class PROJECTTREE_EXPORT sonClass : public ParentClass
{
    Q_OBJECT
public:
    sonClass(QWidget *parent);
    virtual void vfun();//重载父类虚函数
    ~sonClass();
};

这种两重继承关系,如果不继承qt的类,继承常规的类,并不会出现该现象【这里就不贴代码了】,不知道是什么原因?
是QT的机制还是本身C++导出库的机制

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

这是因为在 Qt 的 moc 预处理器中,会为每一个 QObject 类的派生类生成一个元对象(QMetaObject),该元对象中包含了所有虚函数的信息,以及它们在虚表中的偏移量。如果你的父类中有虚函数,但是在子类中并没有重载该函数,那么子类的元对象中就会缺少这个虚函数的信息,从而导致链接错误。解决方法可以参考你提到的三种方案。