为什么构造函数不能够使虚函数
来源:互联网 发布:阿里云客服工资怎么算 编辑:程序博客网 时间:2024/06/01 14:23
虚函数可谓是C++与其它的面向对象语言最大的区别了。虚函数的存在使为了多态,Java当然也有多态。不过实现方式并不是通过虚函数,我们这里就不做介绍了。
虚函数的作用主要是为了继承的时候,子类通过继承虚函数的接口,而实现子类自定义的函数接口,我们通过虚函数表的方式寻找到子类对应的接口。从而实现,一个接口多种实现方式的多态功能。
那么,有一个问题,构造函数是否能够设置为虚函数?答案是否定的。但是为什么呢?构造函数之所以不能设置成虚函数,主要有以下的几个原因。下面分别阐述一下。
1.虚函数的作用是什么?是实现部分或默认的功能,而且该功能可以被子类所修改。如果父类的构造函数设置成虚函数,那么子类的构造函数会直接覆盖掉父类的构造函数。而父类的构造函数就失去了一些初始化的功能。这与子类的构造需要先完成父类的构造的流程相违背了。而这个后果会相当严重。
2.虚函数的调用是需要通过“虚函数表”来进行的,而虚函数表也需要在对象实例化之后才能够进行调用。在构造对象的过程中,还没有为“虚函数表”分配内存。所以,这个调用也是违背先实例化后调用的准则。
3.虚函数的调用是由父类指针进行完成的,而对象的构造则是由编译器完成的,由于在创建一个对象的过程中,涉及到资源的创建,类型的确定,而这些是无法在运行过程中确定的,需要在编译的过程中就确定下来。而多态是在运行过程中体现出来的,所以是不能够通过虚函数来创建构造函数的,与实例化的次序不同也有关系。
那么析构函数为什么可以设计成虚函数呢?由于虚函数是释放对象的时候才执行的,所以一开始也就无法确定析构函数的。而去由于析构的过程中,是先析构子类对象,后析构父类对象。所以,需要通过虚函数来指引子类对象。所以,如果不设置成虚函数的话,析构函数是无法执行子类的析构函数的。
所以,基于以上几点原因,构造函数是不能够设置成虚函数的,而析构函数是要设置成虚函数的。而且这个也是面试中会经常提及的考点。
- 为什么构造函数不能够使虚函数
- 为什么构造函数不能够使虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 为什么构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 为什么构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 为什么构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能为虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- Jersey2.26与spring集成
- APUE-4.3打印文件类型
- 使用指令创建自定义属性的Angular JS
- 为什么JAVA文件中只能含有一个Public类?
- java面试题全集(中)
- 为什么构造函数不能够使虚函数
- 编程实现顺序存储结构和链式存储结构线性表的建立、查找、插入、删除等基本操作
- GDAL-Image to numpy
- C++ 编写 动态规划解决0-1背包问题
- Linux安装ftp组件(8步完成)
- 如何让Eclipse/MyEclipse的web项目在运行时不要自动打开浏览器
- 微信小程序自定义tabbar
- fs.renameSync cannot read property 'path' of undefined
- Atlas教程:创建 AJAX Scribble应用程序