QObject多重继承和operator new

时间:2012-03-10 05:39:25

标签: c++ qt multiple-inheritance qobject

坚持这个奇怪的问题

为什么以下代码适用于g ++

#include <QObject>

class B {
public:
  B(){}
  ~B(){}
};

class A : public QObject, public B {
  Q_OBJECT
public:
  A(QObject * parent = 0 ) : QObject( parent ), B() {}
  ~A(){}
};

int main(int argc, char *argv[])
{
  A a1();
  //A * a = new A();
  //delete a;
  return 0;
}

这不能编译

/*... the same class definitions as above */    

int main(int argc, char *argv[])
{
  //A a1();
  A * a = new A();
  delete a;
  return 0;
}

//error: undefined reference to `vtable for A'

我的意思是如何做好第二件好事?

PS嗯我把所有东西放在单独的文件中,它工作正常。所以这是Q_OBJECT宏的问题,我想。

3 个答案:

答案 0 :(得分:3)

为什么第一个例子编译&amp;干净地链接,而第二个没有?

第一个例子编译和链接,因为:
它不会创建A

的对象
A a1();

声明一个函数a1(),它不带参数并返回A类型。

虽然第二个示例在调用new时创建了一个对象。

请注意,创建了vtable for A'* is a linking error and will only be emitted when a object of A类的未定义引用。因此,只有第二个例子显示错误。

如何解决问题?
您需要为从QObject派生的所有虚函数提供定义。

答案 1 :(得分:3)

如果你定义一个QObject派生类,构建一个应用程序,并意识到你忘了添加Q_OBJECT宏,并在稍后添加它,那么你必须qmake显式更新Makefile。此外,为了安全起见,我建议使用make clean来清除旧文件。在这种情况下,make不够聪明,无法清理所有生成的文件,这个问题经常会给新的Qt开发人员带来麻烦。

有关此错误消息的详细信息,请参阅

http://cartan.cas.suffolk.edu/oopdocbook/html/commonlinkererrors.html#undefinedreftovtable

答案 2 :(得分:0)

该代码适用于Vis。工作室。您的问题可能是B不是多态类 - 我不知道为什么会给您一个错误 - 但您可以尝试在B虚拟中创建一些内容:virtual ~B(){}