首页 > 其他分享 >父类析构函数一定要使用析构函数的原因

父类析构函数一定要使用析构函数的原因

时间:2023-05-10 23:34:49浏览次数:33  
标签:调用 函数 基类 父类析构 Base 析构 派生类

如果基类的析构函数不是虚函数,在删除一个指向派生类对象的基类指针时,只有基类的析构函数被调用,而派生类的析构函数不会被调用。这可能导致资源泄漏,未正确释放派生类分配的内存等问题。

当基类的析构函数被声明为虚函数时,C++运行时会根据实际的对象类型调用相应的析构函数。这意味着当删除指向派生类对象的基类指针时,先调用派生类的析构函数,然后调用基类的析构函数,确保资源被正确释放。

举个例子:

#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }

    // 如果不将此处的析构函数声明为虚函数,会导致未正确释放派生类资源的问题
    virtual ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() : data(new int[10]) {
        std::cout << "Derived constructor" << std::endl;
    }

    ~Derived() {
        std::cout << "Derived destructor" << std::endl;
        delete[] data;
    }

private:
    int *data;
};

int main() {
    Base *basePtr = new Derived();
    delete basePtr; // 如果基类析构函数为虚函数,则会正确调用派生类的析构函数,然后调用基类的析构函数
}

在这个例子中,如果基类的析构函数不是虚函数,删除指向Derived对象的Base指针时,只会调用Base的析构函数,而Derived的析构函数不会被调用。这将导致Derived类中分配的内存(data成员)未被释放,造成内存泄漏。

因此,当使用基类指针处理派生类对象时,通常建议将基类的析构函数声明为虚函数,以确保资源被正确释放。

标签:调用,函数,基类,父类析构,Base,析构,派生类
From: https://www.cnblogs.com/hacker-dvd/p/17389702.html

相关文章

  • Oracle之table()函数的使用,提高查询效率
    目录一、序言二、table()函数使用步骤三、table()具体使用实例3.1table()结合数组使用3.2table()结合PIPELINED函数(这次报表使用的方式)3.3table()结合系统包使用一、序言前段时间一直在弄报表,快被这些报表整吐了,然后接触到了Oracle的table()函数。所以今天把table()函数的......
  • 单链表——追加函数(有无懂的大佬解答一下why不加强制类型过不去)
    #include<bits/stdc++.h>usingnamespacestd;typedefstruct{intid;stringname;}Data;typedefstruct{ DatanodeData; structNode*nextNode;}CLtype;//追加链表CLtype*CLAddEnd(CLtype*head,Datanodedata){CLtype*node,*htemp; if(!(node=(CLt......
  • 用虚函数分别计算各种图形的面积
    一.问题描述:定义抽象基类Shape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、Rectangle(长方形)、Trapezoid(梯形)和Triangle(三角形),用虚函数分别计算各种图形的面积,并求出它们的和。要求用基类指针数组。使它的每一个元素指向一个派生类的对象。PI=3.1415926二.代码实现:#incl......
  • JDK8新特性(二)--- Option\Stream\函数式接口
    OptionalOptional是一个没有子类的工具类,Optional是一个可以为null的容器对象。它的作用主要就是为了解决避免Null检查,防止NullPointerException。//常用方法Optional.of(Tt):创建一个Optional实例Optional.empty():创建一个空的Optional实例Optional.ofNullable(T......
  • flask_视图函数的分离
    随着项目的增大,便于管理,需要把视图函数单独放一起,架构为:~启动文件~视图函数~数据处理~view~其它的帮助函数 启动有两种方法1、集中式管理注册路由,启动文件里调用视图相关的代码 2、 基于类的视图,可插拔视图disp......
  • 获取采购信息记录函数BAPI_INFORECORD_GETLIST
    DATA:lt_purchTYPETABLEOFbapieine,lt_returnTYPETABLEOFbapireturn.FIELD-SYMBOLS:<fs_return>TYPEbapireturn,<fs_purch>TYPEbapieine.CALLFUNCTION'BAPI_INFORECORD_GETLIST'EXPORTING......
  • matlab绘图中set函数的使用汇总
    Matlab绘图中set函数使用汇总%设置标题字体大小,字型set(get(gca,'title'),'FontSize',10,'FontName','宋体');%设置X坐标标题字体大小,字型set(get(gca,'XLabel'),'FontSize',10,'FontName','TimesNewRoman');%设......
  • 写C++模板函数的两种形式
    #include<iostream>template<typenameT>autof1(constT&x){std::cout<<x<<std::endl;};autof2=[](constauto&x){std::cout<<x<<std::endl;};intmain(intargc,char**argv){int......
  • 箭头函数
    箭头函数箭头函数是一个函数表达式,理论上,任何使用函数表达式的场景都可以使用箭头函数。完整语法(参数1,参数2,...)=>{//函数体}如果参数只有一个,可以省略小括号参数=>{}如果箭头函数只有一条返回语句,可以省略大括号,和return关键字参数=>返回值细......
  • 利用css var函数让你的组件样式输出规范样式API,可定制性更高;
    我们平时在使用ElementuiAntdesing这些UI库时,难免会碰到使用deep强行侵入式去修改组件内部样式的情况; 比如下列代码,我们需要把ant的分页样式进行高度自定义,就得使用deep去修改; 这种实现方式确实能够达到我们的目的,但在开发时确总觉得不太合适:1、他属于强行入侵组件内部去......