编译器给出链接错误并要求为Base纯虚析构函数提供定义.
class Base
{
public:
virtual ~Base() = 0;
};
class Derived : public Base
{
public:
virtual ~Derived(){ std::cout << "Derived dtor"; }
};
int main()
{
Derived d;
}
Run Code Online (Sandbox Code Playgroud)
只需为它提供一个空实现(在类定义之外):
Base::~Base() { }
Run Code Online (Sandbox Code Playgroud)
纯粹的虚拟意味着你必须在任何具体的派生类中覆盖成员函数; 这并不意味着它不能拥有一个身体.在析构函数的情况下,你必须提供一个机构,羯羊析构函数是纯虚拟的或者不是,因为它是由编译器,当你摧毁的对象调用.
为了清楚起见,您必须提供一个实现.是否空无由你自己决定.这是因为编译器生成每当你试图摧毁基地的一个实例调用析构函数的代码.您可以声明一个普通的虚拟Base:
virtual ~Base();
Run Code Online (Sandbox Code Playgroud)
永远不要定义它.这将是罚款,只要你不破坏基地的一个实例(可疑行为,但它的工作).然而,在你的情况,基地拥有派生类型,它调用基类的析构函数在自己的析构函数.这就是您的链接器错误来自的地方.