c++中的虚拟析构函数有什么作用?

2025-01-05 09:17:47
推荐回答(4个)
回答1:

如果不用虚拟析构函数,在类继承时就会出现基类的构造函数调用了,但是派生类的构造函数没调用,派生类的对象中派生部分不会被销毁,这将导致资源泄漏。

回答2:

class Father;
class Son : public class Father;
在上述条件下,可以实现多态
Father* pointer = new Son;
当释放时
delete pointer;
在这个时候,如果,father类和son类的析构是虚函数才能够正确释放

回答3:

析构函数同构造函数一样,也是类的一个特殊成员函数。它的作用与构造函数相反,用来处理对象的善后工作,并可完成用户指定的操作,释放对象的存储空间(注意不是撤销空间)。
析构函数的名字是类名前面加上“~”。
析构函数没有函数类型和参数,没有返回值,也没有重载。类中只能有一个析构函数,可以在内部定义也可以在外部定义。
在对象消亡前系统自动调用析构函数,希望析构函数完成的任何操作都必须在定义析构函数中指定。
一般情况下,类的设计者应在声明类的同时定义析构函数,以指定如何完成“清理”工作。如果程序中不定义析构函数,系统会提供一个默认的析构函数,它什么操作都不进行,只用来释放对象的数据成员所占用的空间。

回答4:

自动调用基类部分的析构函数对基类的设计有重要影响。
删除指向动态分配对象的指针时,需要运行析构函数在释放对象的内存之前清除对象。处理继承层次中的对象时,指针的静态类型可能与被删除对象的动态类型不同,可能会删除实际指向派生类对象的基类类型指针。
如果删除基类指针,则需要运行基类析构函数并清除基类的成员,如果对象实际是派生类型的,则没有定义该行为,要保证运行适当的析构函数,基类中的析构函数必须是析构的。
例如:
class A;
class B public A:
则 A* p = new B(), 是可以编译通过的,但在调用析构时需要调用B的析构函数,所以A必须定义为虚函数才能正确析构。