所以,我有一个抽象类Panel
及其实现MyPanel
。它们看起来与此相似:
class Panel : public QWidget
{
public:
Panel(QWidget* parent = 0) = 0;
virtual ~Panel() = 0;
// but wait, there's more!!
};
class MyPanel : public Panel
{
public:
MyPanel(QWidget* parent = 0);
~MyPanel() {}; // nothing to do here
};
MyPanel::MyPanel(QWidget* parent) :
Panel(parent)
{
// you must construct additional pylons
}
我从VC ++中获取构造函数/析构函数的链接器错误
error LNK2019: unresolved external symbol "public: virtual __thiscall Panel::~Panel(void)" (??1Panel@@UAE@XZ) referenced in function "public: virtual __thiscall MyPanel::~MyPanel(void)" (??1MyPanel@@UAE@XZ) mypanel.obj
error LNK2019: unresolved external symbol "public: __thiscall Panel::Panel(class QWidget *)" (??0Panel@@QAE@PAVQWidget@@@Z) referenced in function "public: __thiscall MyPanel::MyPanel(class QWidget *)" (??0MyPanel@@QAE@PAVQWidget@@@Z) mypanel.obj
为什么我收到此链接器错误?
---答案---
class Panel : public QWidget
{
public:
Panel(QWidget* parent = 0) : QWidget(parent) {};
virtual ~Panel() {};
// but wait, there's more!!
};
我以为我在午餐前尝过这个。事实证明我错了。
答案 0 :(得分:6)
答案 1 :(得分:3)
纯粹的虚拟析构函数仍然需要实现。
进一步扩展:
如果子类的任何实例被破坏,将始终调用类的析构函数,因此它需要具有实现。 (基本上,使析构函数完全虚拟化的唯一效果是它会阻止类的实例化。)
至于构造函数:你将它纯粹虚拟化(我没有看到任何理由),但是你明确地从子类的构造函数中调用它。