当接口包含纯虚方法时,建议使用虚拟析构函数。例如,我有这样的代码:
template class A { protected: char buffer[Size]; public: virtual void method() = 0; A() = default; virtual ~A() = default; }; template class B : public A { public: void method() override; B() = default ~B() = default; }; int main() { B b; b.method(); }
但是,当我试图用g为Arduino Due编译时,我得到了以下错误:
main.cpp:(.text._ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED0Ev[_ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED5Ev]+0x6): undefined reference to `operator delete(void*, unsigned int)'
然而,当我将析构函数从一个整体中删除时,它会删除错误,但这不会导致未反馈的行为吗?此外,当我刚刚从的析构函数中删除virtual关键字时,它会给我相同的错误消息。
非常奇怪的是,只有析构函数的存在才会引入对全局删除算子的引用。然而,您似乎不是第一个遇到这个问题的人:对“operator delete(void*)”的未定义引用。正如在那里的评论中指出的那样,C标准库在avr-g上实际上并不可用,而avr-g很可能也是您正在使用的。
尽管如此,我相信我可以提供一些救济。
当接口包含纯虚方法时,建议使用虚析构函数。
虚拟析构函数仅在您需要通过基指针[expr.delete]/3删除
对象时才是必需的。将虚拟析构函数视为接口本身的一部分。如果接口声明了虚拟析构函数,则意味着“可以删除实现该接口的对象”。操作删除
成为接口的一部分。
如果您不需要将删除功能作为界面的一部分(我认为这实际上应该是默认功能),那么您就不需要虚拟析构函数。只需声明析构函数为非虚拟并对其进行保护。因此,您可以从接口中删除操作delete,并将是否可以进一步删除类型的决定传递给接口的更具体实现…
非常感谢你的帮助,noctilux
我读过一些文章,正如他们所说,主要的虚拟析构函数用例是: > 派生类可能具有来自堆的动态数据分配,即“拥有”该数据对象。所以,他们需要在析构函数中使用一些删除例程。通过基类指针删除需要在所有派生类中声明析构函数,直到那些具有动态数据分配的析构函数(基类也需要它) 此类具有< code >虚拟方法。但这对我来说不清楚。仅仅通过基类指针调用< code >虚拟方法总是会导致派生实现最多的调用。他们唯一
我得到一个 据我所知,构造函数是被定义的,但是编译器显然看不到它。我唯一的结论是存在某种包含问题(例如,循环包含)。 我已经为下面的每个翻译单元制作了一个包含图,但是我看不出有任何问题。任何指导都将不胜感激。 包括:
问题内容: 我正在使用Linux,并且具有以下文件: 该函数在中声明和定义。我需要在中使用该函数,因此我将该函数声明为 在。 但是,在编译过程中,我得到了错误 怎么了? 谢谢。 预计到达时间:多亏了我收到的答案,我现在有了以下内容: 在fileA.h中,我有 在fileA.c中,我有 在fileB.h中,我有 在fileB.cpp中,我有 但是,我现在有错误 问题答案: 如果您确实是使用C而不是C
在C 11中,我们能够声明一个析构函数是自动生成的: 此外,我们可以将析构函数声明为纯虚: 我的问题是:如何将析构函数声明为自动生成和纯虚拟?看起来以下语法不正确: 这一个也不是: 也不是这个: 编辑:关于问题目的的一些澄清。基本上,我希望一个空类是不可实例化的基类,但派生类是可实例化的,那么该类必须有一个纯虚拟析构函数。但另一方面,我不想在.cpp文件中提供定义。因此,我需要某种与等效的机制。我
问题内容: 我只是试图制作一个简单的类,让我弄清楚文件的长度: 我遇到了一个问题 我得到错误: 未为参数类型定义运算符!= int,null 有什么想法为什么会阻止这种情况吗? 问题答案: Java中的原始类型不能为。如果要检查0,请执行。