为什么基类中的析构函数要声明为虚析构函数?
来源:互联网 发布:mac破解软件大全下载 编辑:程序博客网 时间:2024/06/06 03:10
题目
为什么基类中的析构函数要声明为虚析构函数?
解答
用对象指针来调用一个函数,有以下两种情况:
- 如果是虚函数,会调用派生类中的版本。
- 如果是非虚函数,会调用指针所指类型的实现版本。
析构函数也会遵循以上两种情况,因为析构函数也是函数嘛,不要把它看得太特殊。 当对象出了作用域或是我们删除对象指针,析构函数就会被调用。
当派生类对象出了作用域,派生类的析构函数会先调用,然后再调用它父类的析构函数, 这样能保证分配给对象的内存得到正确释放。
但是,如果我们删除一个指向派生类对象的基类指针,而基类析构函数又是非虚的话, 那么就会先调用基类的析构函数(上面第2种情况),派生类的析构函数得不到调用。
请看例子:
输出是:
如果我们把基类的析构函数声明为虚析构函数,这会使得所有派生类的析构函数也为虚。 从而使析构函数得到正确调用。
将基类的析构函数声明为虚的之后,得到的输出是:
因此,如果我们可能会删除一个指向派生类的基类指针时,应该把析构函数声明为虚函数。 事实上,《Effective C++》中的观点是,只要一个类有可能会被其它类所继承, 就应该声明虚析构函数。
原文地址:http://www.cricode.com/760.html
C++中的虚函数是如何工作的?
虚函数依赖虚函数表进行工作。如果一个类中,有函数被关键词virtual进行修饰, 那么一个虚函数表就会被构建起来保存这个类中虚函数的地址。同时, 编译器会为这个类添加一个隐藏指针指向虚函数表。如果在派生类中没有重写虚函数, 那么,派生类中虚表存储的是父类虚函数的地址。每当虚函数被调用时, 虚表会决定具体去调用哪个函数。因此,C++中的动态绑定是通过虚函数表机制进行的。
当我们用基类指针指向派生类时,虚表指针vptr指向派生类的虚函数表。 这个机制可以保证派生类中的虚函数被调用到。
原文地址:http://www.cricode.com/751.html
- 为什么基类中的析构函数要声明为虚析构函数?
- 为什么基类中的析构函数要声明为虚析构函数?
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 为什么基类的析构函数声明为虚函数?
- 为什么析构函数常声明为虚函数
- 为什么析构函数常声明为虚函数
- 为什么析构函数常常声明为虚函数
- 为什么析构函数常声明为虚函数
- 为什么析构函数常声明为虚函数?
- c++ 为什么析构函数必须声明为虚函数
- 为什么要将基类的析构函数声明为虚函数
- 关于基类为什么要声明析构函数
- 为什么构造函数不可以声明为虚函数,而析构函数最好声明为虚函数
- 为什么构造函数不可以被声明为虚函数而析构函数有时候必须声明为虚函数
- 为什么把c++类的析构函数声明为虚函数?
- C++里父类的析构函数为什么声明为virtual
- 构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数
- 为什么基类的析构函数要声明成虚函数
- 使用nandwrite烧写yaffs2文件系统
- 1015. Reversible Primes (20) ——PAT (Advanced Level) Practise
- ios 底层数据结构
- GitHub问题之恢复本地被删除的文件
- C++之构造函数与析构函数
- 为什么基类中的析构函数要声明为虚析构函数?
- asp.net数据库缓存依赖
- POJ 3224 Go for Lab Cup!(水题)
- MySQL性能医生:OrzDBA
- NSCalendar日历使用详解
- Core Data Features(Apple官方文档译文)
- SpringMVC环境的搭建
- 《大话数据结构》读书笔记之二叉堆基本操作(最大堆)
- Git 使用笔记