zoukankan      html  css  js  c++  java
  • 【C++基础 08】virtual析构函数的作用

    在面向对象语言中,接口的多种不同的实现方式即为多态。c++可以使用virtual来实现多态。

    如果不使用virtual的话,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态编联(也就是迟后绑定,运行的时候才确定调用哪个对象)。

    关于virtual的用法比较简单,不再复述,我们这次来看看virtual析构函数的作用。

    1.示例

    我们先来看一段代码:

    class A
    {
    public:
      ~A()
      {
        cout<<"~A()";
      }
    };
    
    class A1 : public A{
    public:
      ~A1()
      {
        cout<<"~A1()";
      }
    };
    
    void main()
    {
      A* a = new A1();//基类指针接受子类对象
      delete a;
      return;
    }
    咋一看好像没什么问题,但运行一下你会发现输出的结果是~A()。

    也就是说只析构了基类的对象,没有释放子类的对象,造成局部销毁这种诡异的资源泄漏问题。

    消除这种问题的做法也很简单,给基类添加一个virtual析构函数,此后删除子类就会销毁整个对象。

    2.实现:

    class A
    {
    public:
    	virtual ~A()
    	{
    		cout<<"~A()";
    	}
    };
    
    class A1 : public A{
    public:
    	~A1()
    	{
    		cout<<"~A1()";
    	}
    };
    
    void main()
    {
    	A* a = new A1();
    	delete a;
    	return;
    }
    加上virutal关键字后,运行结果:先是子类的析构~A1() 然后是基类的析构~A()。整个对象被销毁,不存在局部销毁问题。


    一个比较好的判断方式是:如果你的基类(base classes)设计是为了多态用途,那么它应该声明一个virtual析构函数,如果classes带有任何virtual函数,那么它也应该有一个virtual析构函数。

  • 相关阅读:
    125、TensorFlow计算图的执行
    123、TensorFlow的Job
    122、TensorFlow多设备运行
    121、TensorFlow张量命名
    关于CSRF跨域请求伪造的解决办法
    angular基于ui-router实现系统权限控制
    gulp自动化打包及静态文件自动添加版本号
    深入研究HTML5实现图片压缩上传
    移动web模拟客户端实现多方框输入密码效果
    高级功能:很有用的javascript自定义事件
  • 原文地址:https://www.cnblogs.com/fzll/p/3954581.html
Copyright © 2011-2022 走看看