qt中会不小心遇到error: undefined reference to `vtable for ....'原来是是子类的一个虚函数声明了,但是,在.cpp中没有定义 实现代码。
比如在.h中把~hellodialog()屏蔽掉后;
:
1 class hellodialog : public QDialog 2 { 3 Q_OBJECT 4 public: 5 explicit hellodialog(QWidget*parent = 0); 6 // ~hellodialog(); 7 8 signals: 9 10 public slots: 11 12 private: 13 // Ui::hellodialog *ui; 14 };
而在.cpp中把~hellodialog()的定义也去掉
1 hellodialog::hellodialog(QWidget *parent) : QDialog(parent) 2 { 3 //ui = new Ui::hellodialog; 4 //ui->setupUi(this); 5 } 6 7 //hellodialog::~hellodialog() 8 //{ 9 // delete ui; 10 //}
就不会报错了。当我们把这两个屏蔽都去掉后,就会报错。
在其他博客上看到比较好的知识点,粘贴过来:
比如:
class QParent
{
public:
QParent();
virtual ~QParent();
...//其它代码
};
class QChild:public QParent
{
public:
QChild();
~QChild();
...//其它代码
};
显然类QChild的析构函数~QChild()是一个虚函数,必须得定义它。所以在QChild的实现.cpp文件中
应该添加该函数的实现部分,如下
QChild::~QChild()
{
...//实现代码
}
如果你认为QChild不需要释放资源,不需要添加实现代码,可以把类声明改一下即可,如下
class QChild:public QParent
{
public:
QChild();
~QChild(){};
...//其它代码
};
红色部分为添加部分,如果不添加也不在实现.cpp文件添加该虚函数的实现就会出“undefined reference to `vtable for QChild”的错误