为什么析构函数常声明为虚函数
来源:互联网 发布:阿里云奥运logo 编辑:程序博客网 时间:2024/05/22 06:16
转自 http://www.cnblogs.com/huhuuu/archive/2013/12/01/3453063.html
析构函数的作用与构造函数正好相反,是在对象的生命期结束时,释放系统为对象所分配的空间,即要撤消一个对象。
用对象指针来调用一个函数,有以下两种情况:
1.如果是虚函数,会调用派生类中的版本。(在有派生类的情况下)
2.如果是非虚函数,会调用指针所指类型的实现版本。
析构函数也会遵循以上两种情况,因为析构函数也是函数嘛,不要把它看得太特殊。 当对象出了作用域或是我们删除对象指针,析构函数就会被调用。
1.当派生类对象出了作用域,派生类的析构函数会先调用,然后再调用它父类的析构函数, 这样能保证分配给对象的内存得到正确释放。
2.但是,如果我们删除一个指向派生类对象的基类指针,而基类析构函数又是非虚的话, 那么就会先调用基类的析构函数(上面第2种情况),派生类的析构函数得不到调用。
请看例子:
#include<stdio.h>#include<iostream>class A{public:A(); virtual~A(); virtual void fun1(){ printf("123"); }};A::A(){}A::~A(){ printf("Delete class A\n");}class B : public A{public:B(); ~B(); void fun2(){ printf("123456"); }};B::B(){ }B::~B(){ printf("Delete class B\n");} A *a=new B;//B *b=new A; //无法从“A *”转换为“B *”B *c=new B;A *d=new A;int main(){ delete a; //delete c; //delete d; return 0;}
析构函数加上虚函数,当你动态申请一个对象时,并且把这个对象的指针赋值给基类,这时当你用这个基类指针释放内存时,就有用了,因为这样可以用多态性原理调用对象实际的析构函数来析构内存。
#include<stdio.h>#include<iostream>class A{public:A(); ~A(); virtual void fun1(){ printf("123"); }};A::A(){}A::~A(){ printf("Delete class A\n");}class B : public A{public:B(); ~B(); void fun2(){ printf("123456"); }};B::B(){ }B::~B(){ printf("Delete class B\n");} A *a=new B;//B *b=new A; //无法从“A *”转换为“B *”B *c=new B;A *d=new A;int main(){ delete a; //delete c; //delete d; return 0;}
析构函数去掉虚函数,就不能调用子类中的析构函数了
当你动态申请一个对象时,并且把这个对象的指针赋值给当前类,析构函数去掉虚函数,都不会影响子类到父类的虚构
#include<stdio.h>#include<iostream>class A{public:A(); ~A(); virtual void fun1(){ printf("123"); }};A::A(){}A::~A(){ printf("Delete class A\n");}class B : public A{public:B(); ~B(); void fun2(){ printf("123456"); }};B::B(){ }B::~B(){ printf("Delete class B\n");} A *a=new B;//B *b=new A; //无法从“A *”转换为“B *”B *c=new B;A *d=new A;int main(){ delete c; //delete c; //delete d; return 0;}
0 0
- 为什么析构函数常声明为虚函数
- 为什么析构函数常声明为虚函数
- 为什么析构函数常声明为虚函数
- 为什么析构函数常声明为虚函数?
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 为什么析构函数常常声明为虚函数
- c++ 为什么析构函数必须声明为虚函数
- 为什么要将基类的析构函数声明为虚函数
- 为什么构造函数不可以声明为虚函数,而析构函数最好声明为虚函数
- 为什么构造函数不可以被声明为虚函数而析构函数有时候必须声明为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- 实时操作系统的任务调度示例之时间片
- Git Commit的日志格式规范
- 通过IP查找ip所对应网卡名
- 小白笔记----------------------log4j笔记(二)
- 为什么析构函数常声明为虚函数
- ubuntu下如何在python中安装mysql,并测试
- AFN同步异步请求
- 搭建大数据处理集群(Hadoop,Spark,Hbase)
- Oracle 外连接
- 安卓向服务器发送数据和服务器接收数据全过程
- Android 防止popup window遮挡软键盘
- Nutz框架-- Cnd条件使用原生sql
- Namenode HA原理详解(脑裂)