问题标签 [virtual-destructor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 我不明白析构函数有什么问题?
我有一个名为多边形的类,它是我的基类,其中我有面积和周长,我需要从中派生一个矩形类。现在下面的程序不起作用,它给了我以下错误:
这是由于我添加到程序中的析构函数,但是当我删除它们时,它都可以工作。我做了一些研究,发现这可能是由于我没有正确编译程序 .cpp 文件。那是我的问题吗?如果没有,我的问题是什么?
c++ - 在第三方软件中派生没有虚拟析构函数的类
我得到了一个第三方库,其中包含要使用的标头。现在这个库有一个类'Base'。这个类的问题是它没有虚拟析构函数。现在,由于我没有第三方代码,我无法在那里进行更改。
我被告知用它编写几个派生类,并确保在删除对象时正确清理对象。我们怎样才能做到这一点?
谢谢回复,看来我只有2个选项。
1)将虚拟析构函数放在派生类中 2)使用组合。
我打算采用第一种方法。我打算使用带有虚拟析构函数的包装派生类。然后使用这个包装派生类进行进一步的派生。下面是代码。
请让我知道这种方法是否可行?
c++ - 访问冲突 - 为什么基类析构函数被调用两次?
我有一个Player
尝试实现该Decorator
模式的类。Player
包含其基类的成员,Character
称为m_player
. 从客户端调用析构函数时Player
,我遇到了一些导致内存访问冲突的问题。开始于main
:
delete
在我调用操作员 on后不久发生错误,该操作员mainCharacter
具有以下调用顺序:
然后是析构函数Character
:
然而,奇怪的是,这个析构函数似乎被调用了两次——一旦完成上述操作,调试器就会带我进入一个反汇编,逐步通过“标量删除析构函数”,它似乎Character
再次调用析构函数,通过的接口Player
,称为CharacterDecorator
:
崩溃点的调用堆栈:
调用CharacterDecorator
' 的析构函数会导致随后调用Character
' 的析构函数:
在这一点上,我完全糊涂了——我不知道为什么析构函数会通过抽象接口再次被调用,而析构函数会CharacterDecorator
通过其具体实现被调用。此外,添加析构函数CharacterDecorator
似乎并不能解决问题。
作为参考,我已经包含了 的实现Player
和Character
接口CharacterDecorator
:
Player
:
Character
:
c++ - 当你有一个虚拟析构函数时,基类指针中的“删除这个”会删除派生类对象吗?
我有一个三层深的类层次结构,如下所示:
好的,所以我想知道的是当我foo()
调用C
. 它是要删除整个对象还是只删除对象的一部分,B
并将A
部分留C
在内存中?
c++ - 如何正确继承析构函数不是虚拟的基类?
我想从 A 类继承,但是 A 的析构函数不是虚拟的,我不能修改 A 的定义。如何避免以下情况?
c++ - 虚拟析构函数同时调用派生析构函数和基析构函数
我无法理解虚函数。当我重载一个虚函数时,是否只调用新的派生函数?还是派生函数和基函数?因为我注意到当调用虚拟析构函数时,会调用基类和派生类析构函数。
c++ - C++ 中的继承和虚拟析构函数的问题
所以我有两个类,一个是抽象的,一个不是。
抽象类是Iterator,具体类是LinkedListIterator。两者的代码都在帖子的底部。
我遇到的问题是代码如下,我在析构函数的最后一行的 LinkedListIterator 中出现 1 个错误说
现在我尝试注释掉虚拟 ~Iterator() 析构函数,没有错误,但我收到警告说:
所以我的问题是:抽象迭代器基类中是否需要一个虚拟析构函数?我读过你应该总是有一个,但在这种情况下,LinkedListIterator 中的析构函数只是设置值,它不会释放任何东西......
谢谢!
迭代器代码:
相关 LinkedListIterator 代码(这是一个较长的类):
c++ - 继承层次结构中的析构函数排序
如果我有以下层次结构:
- F 类包含类型的成员对象(E 类和 D 类,按此顺序声明)
- F类继承具体类C类
- C类继承抽象/纯虚类B类
- B类继承具体类A
如果调用 F 类对象的析构函数,则按以下顺序发生以下情况:
- 调用 F 类(派生最多的)析构函数并完成
- 调用 D 类(成员对象 2)析构函数并完成
- 调用 E 类(成员对象 1)析构函数并完成
- 调用 C 类(F 的基础)析构函数并完成
- 调用 A 类(B 的基础,C 的基础)析构函数并完成
- B类(虚拟,C的基础)析构函数被调用并完成
它是否正确?所以基本上到最后C继承了虚拟B,虚拟B继承了A,但是C被破坏了,然后是A,然后是虚拟B?
编辑:C++ 常见问题解答 说:
“虚拟基类是特殊的——它们的析构函数在最派生类的构造函数的末尾被调用”
这是我想要理解的?
c++ - C++ 中的析构函数概念
请通过我的以下代码:
在上面的代码中,指针包含派生类对象的地址,所以当我删除指针时它应该调用派生类析构函数和基类析构函数,但为什么它只调用基类析构函数。如果我将基类析构函数设为虚拟,那么它同时调用派生类和基类析构函数,为什么?在虚函数的情况下,基类和派生类都具有相同的函数名称,因此编译器解析派生类中派生最多的函数名称,但这里的析构函数不会具有相同的名称,那么编译器如何解析它必须调用的函数名称在运行时。请解释我如何
c++ - 没有虚拟方法的虚拟析构函数有什么害处吗?
在我的设计过程中,有时我会添加/或删除虚拟方法。我知道的经验法则是,一旦我有了虚拟方法,我就会有一个虚拟析构函数。
我的问题:如果我在创建类时立即添加虚拟析构函数(即使还没有虚拟方法),会有什么害处吗?基本上这个想法是不要忘记它。特别是对于 n 个派生类,我以后不需要在 n 个地方更改它。