Q_OBJECT 派生类,继承

Posted

技术标签:

【中文标题】Q_OBJECT 派生类,继承【英文标题】:Q_OBJECT derived class, inheritance 【发布时间】:2016-01-30 18:25:24 【问题描述】:

我是 qt 的新手。 我有下一个继承:

class Poster : public QObject 

  Q_OBJECT


class SyncPoster: public Poster 

  Q_OBJECT

private slots:
  ... some functions



class TextPoster : public Poster


  Q_OBJECT

private slots:
   ... some functions


但是组装会引发以下错误:

架构 x86_64 的未定义符号:“vtable for SyncPoster”, 参考自: SyncPoster::SyncPoster(Window*, QString const&, QString const&, QString const&, QString const&) 在 sync_poster.o 注意:缺少 vtable 通常意味着第一个非内联虚成员函数具有 没有定义。 ld:未找到架构 x86_64 的符号

这是什么意思,我做错了什么?你有什么想法吗?

【问题讨论】:

【参考方案1】:

此错误的一个常见情况是,当您创建 QObject 派生类并在构建之前添加或删除 Q_OBJECT 时未调用 qmake。

如果您刚刚添加了 Q_OBJECT,对 qmake 的缺失调用不会触发文件的重新解析,并且 moc 将不会运行。

【讨论】:

【参考方案2】:

来自类似主题Why am I getting "Undefined symbols ... typeinfo ... vtable" with a virtual and concrete class?:

...您似乎将定义与声明混淆了。你有什么 在基类中只是没有定义的声明,即 执行。您要么需要使其成为纯虚拟的,要么需要实现 即使它只是一个空的 ...

检查构造函数的声明和定义。你的SyncPoster有公共构造函数吗?它有定义吗? (有身体吗?)

SyncPoster::SyncPoster(/*...*/)

检查是否有body:

SyncPoster::SyncPoster(/*...*/) 
                              //^^^  body

【讨论】:

我有所有的类在头文件中有 Q_OBJECT 宏。我已经编辑了问题 我能从中看出什么? 检查是否有没有定义的声明 我检查了所有方法,似乎没问题。实际上我只是重建了一段时间我的项目,现在一切都很好。似乎只是 IDE 缓存错误。

以上是关于Q_OBJECT 派生类,继承的主要内容,如果未能解决你的问题,请参考以下文章

继承与派生

继承派生新式类与经典类

C++的探索路12继承与派生之高级篇--派生类与赋值运算符及多重继承

类的继承与派生

基类 派生类 类的继承与约束

C++ | 类继承