析构函数是否要声明为虚函数

如果是派生类继承基类,且存在基类指针指向派生类对象,那么析构函数应该声明成虚函数。

如果析构函数不是虚函数,指向派生类对象的基类指针,在销毁对象时,会调用基类的构造函数,而不会调用派生类的析构函数,可能会造成内存泄漏。
为什么这样会调用基类的构造函数?因为,如果析构函数不是虚函数,析构时,实际调用的函数,在编译期间会被确定为指针类型类的析构函数,即基类的析构函数。

如析构函数是虚函数,指向派生类对象的基类指针,在销毁对象时,会调用派生类的析构函数,派生类的析构函数又自动调用基类的析构函数,这样可以避免内存泄漏。
为什么这样会调用派生类的构造函数?因为,声明成虚函数的析构函数,析构时,实际执行的函数的地址,在编译期间不确定,在运行时,才根据虚表指针和虚函数表计算出析构时实际执行的函数地址,即派生类的析构函数地址。
为什么这样计算出的是派生类的析构函数地址呢?因为虚表指针指针是每个派生类对象都拥有的,且指向派生类的虚函数表,派生类的虚函数表中又存放着声明为虚函数的析构函数的地址。

那是不是,所有类的析构函数都要声明成虚函数呢?不是的,如果一个类没有派生类,或者,这个类是基类,有派生类,但是不会出现基类指针指向派生类对象的情况,那这个类的析构函数,就没必要声明成虚函数。如果声明成了虚函数,在析构时,会多了查虚函数表的过程,而且内存中也要多维护虚函数表和虚表指针,会增大开销。

猜你喜欢

转载自blog.csdn.net/wx_assa/article/details/107844125
今日推荐