ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++学习笔记

2021-09-08 10:04:41  阅读:123  来源: 互联网

标签:pb 调用 函数 基类 笔记 学习 C++ 析构 派生类


C++继承与多态(5)

虚析构函数

一. 两个问题:

  • 问题一: 哪些函数不能实现成虚函数?

    首先要认识虚函数的依赖:
    1.虚函数能产生地址,存储在vftable当中
    2.对象必须存在(vfptr->vftable->虚函数地址,而vfptr存储在对象的内存空间中)

    根据虚函数的依赖条件可以分析得出:

    ​ 1.构造函数
    ​ (1) virtual+构造函数(不可以)
    ​ (2) 构造函数中(调用的任何函数,都是静态绑定的)调用虚函数,也不会发生静态绑定

    ​ (3) 派生类对象的构造过程,先调用的是基类的构造函数,然后才调用派生类的构造函数

    1. static静态成员方法(不可以)
      静态成员方法不依赖对象
  • 问题二: 关于虚析构函数, 什么时候基类的析构函数必须实现成虚函数?

    解答:基类的指针(引用)指向堆上new出来的派生类对象的时候, delete pb(基类的指针),
    它调用析构函数的时候,必须发生动态绑定,否则会导致派生类的析构函数无法调用

    举个例子分析一下问题二

    简单定义基类Base和其派生类Derive

    class Base
    {
    public:
    	Base(int data = 10) :ma(data) { cout << "Base(int data = 10)" << endl; }
    	void show() { cout << "Base::show()" << endl; }
    	~Base() { cout << "~Base()" << endl; }
    protected:
    	int ma;
    };
    
    class Derive : public Base
    {
    public:
    	 
    	Derive(int data = 20)
    		:Base(data), mb(data)
    	{
    		cout << "Derive(int data = 20)" << endl;
    	}
    	virtual void show() { cout << "Derive::show()" << endl; }
    	
    	// 基类的析构函数是虚函数,那么派生类的析构函数自动成为虚函数
    	~Derive() 
    	{
    		cout << "~Derive()" << endl;
    	}
    private:
    	int mb;
    };
    

    主函数部分

    int main()
    {
    	Base* pb = new Derive(10);
    	pb->show(); 
    	delete pb; // 派生类的析构函数没有调用
    }
    
    • case1: 基类Base的析构函数不是虚函数时

      image-20210906234213386

      ​ 由以上结果可知,派生类的析构函数没有调用, 这是因为delete需要先调用析构函数(释放外部占用的内存资源(如果需要的话)),然后才会释放内存(free), 而调用析构函数pb->~Base() , 找到的是基类的析构函数,发生的是静态绑定。

    • case2: 基类Base的析构函数是虚函数时

      image-20210906235436031

      ​ 由以上结果可知,delete调用pb->~Base()时发生了动态绑定,pb获得了派生类对象空间前四个字节的值(即vfptr,指向派生类的虚函数表),利用vfptr访问派生类的虚函数表,所以调用的也是派生类的析构函数

    以上例子很好说明当基类的指针pb指向一个new出来的派生类的对象时,基类的析构函数必须写成虚函数确保delete pb, 在调用析构函数时发生动态绑定,能够调用派生类的析构函数,避免派生类对象无法析构,造成内存泄漏。

标签:pb,调用,函数,基类,笔记,学习,C++,析构,派生类
来源: https://www.cnblogs.com/ChenFei-Blogs/p/15241403.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有