我收到警告:
error: deleting object of abstract class type ‘Converter::ConversionImpl’ which has non-virtual destructor will cause undefined behavior [-Werror=delete-non-virtual-dtor]
delete it->second;
^~~~~~
这使我在解决方面遇到了一些困难。我试过应用虚拟,但我怀疑这与地图有关,这是一个多图,我似乎无法找到虚拟删除操作符的替代品。事实上,我的所有研究表明,这实际上是正确的方法,如果有点不标准的话。 (没有一个研究实例与这里实际完成的内容相匹配)。
typedef multimap<int,ConversionImpl*> ConversionImplList;
struct CRegistry {
ConversionImplList list;
CRegistry();
~CRegistry()
{
for (ConversionImplList::iterator it=list.begin(); it!=list.end(); ++it)
{
delete it->second;
}
list.clear();
}
};
为什么它会抛出第二个问题,而不是整个析构函数,哪里是找到涵盖这种情况的材料的最佳位置?
Code in Full(不是我同意的世界上最好的作品,我仍然围绕着一切)。 Converter.h
修改
此解决方案在下面的注释中指出,并引用在关联标头中声明的类,而不是文件本身。这里的关键是要仔细查看警告信息的措辞,因为这些词语意味着具体的事情。
在这种情况下,类升级为1,未能将析构函数声明为“虚拟”。很有可能,当出现类似的错误时,这可能是原因。
答案 0 :(得分:0)
我在代码中找不到指针添加到list
的位置。但是,您无法将具有纯虚函数的类实例化为完整类型,例如s Converter::ConversionImpl
。因此,list
中的元素无法指向多态类型Converter::ConversionImpl
的对象。您必须先继承此类才能使用它。
将实现添加到纯虚函数或从类派生并使析构函数也是虚拟的。在这种情况下,您将需要覆盖基类中的虚函数。