构造函数为什么不能是虚函数
2015-12-19 18:50
225 查看
从存储空间角度看
虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向
vtable的指针事实上是存储在对象的内存空间的。
问题出来了,假设构造函数是虚的。就须要通过
vtable来调用。但是对象还没有实例化,也就是内存空间还没有,怎么找
vtable呢?所以构造函数不能是虚函数。
从使用角度
虚函数主要用于在信息不全的情况下,能使重载的函数得到相应的调用。构造函数本身就是要初始化实例。那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。
虚函数的作用在于通过父类的指针或者引用来调用它的时候可以变成调用子类的那个成员函数。
而构造函数是在创建对象时自己主动调用的,不可能通过父类的指针或者引用去调用(没有存在的必要)。因此也就规定构造函数不能是虚函数。
构造函数不须要是虚函数。也不同意是虚函数
由于创建一个对象时我们总是要明白指定对象的类型。虽然我们可能通过基类的指针或引用去訪问它但析构却不一定,我们往往通过基类的指针来销毁对象。这时候假设析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。从实现上看
vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数。从实际含义上看,在调用构造函数时还不能确定对象的真实类型(由于子类会调父类的构造函数);并且构造函数的作用是提供初始化,在对象生命期仅仅运行一次,不是对象的动态行为,也没有必要成为虚函数。
虚函数表实现角度
当一个构造函数被调用时。它做的首要的事情之中的一个是初始化它的VPTR。
因此。它仅仅能知道它是“当前”类的,而全然忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码——既不是为基类,也不是为它的派生类(由于类不知道谁继承它)。
所以它使用的
VPTR必须是对于这个类的
VTABLE。并且,仅仅要它是最后的构造函数调用,那么在这个对象的生命期内。
VPTR将保持被初始化为指向这个
VTABLE, 但假设接着另一个更晚派生的构造函数被调用,这个构造函数又将设置
VPTR指向它的
VTABLE,等直到最后的构造函数结束。
VPTR的状态是由被最后调用的构造函数确定的。这就是为什么构造函数调用是从基类到更加派生类顺序的另一个理由。但是,当这一系列构造函数调用正发生时。每一个构造函数都已经设置
VPTR指向它自己的
VTABLE。假设函数调用使用虚机制。它将仅仅产生通过它自己的
VTABLE的调用,而不是最后的
VTABLE(全部构造函数被调用后才会有最后的
VTABLE)。
相关文章推荐
- 多个DataSet数据合并
- UVALive 6850 Hidden Plus Signs(dfs)
- 第16周项目1(7)归并排序
- ubuntu14.04安装hbase1.0.2
- SpringMVC+Spring+Hibernate的小样例
- Redis 3 在CentOS 6.5上安装笔记,含启动脚本
- 第16周项目1(6)堆排序
- BZOJ-1024 生日快乐 DFS+一丝sb的数学思考
- bootstrap表单校验之bootstrapvalidator
- 5-4 UVA 10763 Foreign Exchange交换学生
- BZOJ-1024 生日快乐 DFS+一丝sb的数学思考
- 猜你喜欢-----推荐系统原理介绍
- HDU 1086:You can Solve a Geometry Problem too
- linux安装php出现的错误
- [KMP]个人对于KMP算法的理解
- MySQL 改动用户password及重置rootpassword
- 数据结构期末总结
- 深入解析开源项目之Retrofit(二)框架篇
- Oracle中的for语句
- 观察者模式(head first读书笔记)