[英]QObject multiple inheritance and operator new
陷入這個奇怪的問題
為什么以下代碼對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宏的問題。
為什么第一個示例不能干凈地編譯並鏈接而第二個示例卻不能干凈地編譯?
第一個示例編譯和鏈接是因為:
它不會創建A
的對象。
A a1();
聲明一個不帶參數且返回A
類型的函數a1()
。
而第二個示例在調用new
時創建一個對象。
請注意,* vtable for A'* is a linking error and will only be emitted when a object of
未定義引用vtable for A'* is a linking error and will only be emitted when a object of
創建類A` vtable for A'* is a linking error and will only be emitted when a object of
。 因此,只有第二個示例顯示了錯誤。
如何解決問題?
您需要為從QObject
派生的所有虛函數提供定義。
如果定義了QObject派生的類,構建了一個應用程序,並且意識到您忘記添加Q_OBJECT宏,而后又添加了它,則qmake顯式更新Makefile很重要。 此外,為了安全起見,我建議進行清理以清除舊文件。 在這種情況下,make不夠聰明,無法清理其所有生成的文件,這是一個經常引起新Qt開發人員頭痛的問題。
有關此錯誤消息的更多信息,請參見
http://cartan.cas.suffolk.edu/oopdocbook/html/commonlinkererrors.html#undefinedreftovtable
該代碼在Vis中有效。 工作室。 您的問題可能是B
不是一個多態類-我不知道為什么這會給您帶來錯誤-但您可以嘗試使用B
虛擬方法制作一些東西:例如virtual ~B(){}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.