一个示例:
class Parent
{
public:
Parent() {}
virtual ~Parent() = 0;
};
class Child : public Parent
{
//具体实现
};
int main()
{
{
Parent* p = new Child();
}
system("pause");
return 0;
}
编译时会报如下错误:
LNK2019 无法解析的外部符号 "public: virtual __thiscall Parent::~Parent(void)" (??1Parent@@UAE@XZ),该符号在函数 "public: virtual __thiscall Child::~Child(void)" (??1Child@@UAE@XZ) 中被引用 vptr E:\c++\study\纯虚析构函数\vptr\vptr\vptr.obj 1
分析:
父类的析构函数定义为了纯虚的析构函数,析构函数的执行顺序为先析构子类,再析构父类。当析构父类的时候,找不到函数体,故编译失败。
解决:
class Parent
{
public:
Parent() {}
virtual ~Parent() = 0; //可以这样定义,但是如果作为父类,需要单独定义函数体
};
Parent::~Parent()
{
}
对纯虚析构函数进行单独定义即可。