为什么构造函数不能够使虚函数

原创 2016年05月30日 21:46:41

            虚函数可谓是C++与其它的面向对象语言最大的区别了。虚函数的存在使为了多态,Java当然也有多态。不过实现方式并不是通过虚函数,我们这里就不做介绍了。

        虚函数的作用主要是为了继承的时候,子类通过继承虚函数的接口,而实现子类自定义的函数接口,我们通过虚函数表的方式寻找到子类对应的接口。从而实现,一个接口多种实现方式的多态功能。

      那么,有一个问题,构造函数是否能够设置为虚函数?答案是否定的。但是为什么呢?构造函数之所以不能设置成虚函数,主要有以下的几个原因。下面分别阐述一下。

      1.虚函数的作用是什么?是实现部分或默认的功能,而且该功能可以被子类所修改。如果父类的构造函数设置成虚函数,那么子类的构造函数会直接覆盖掉父类的构造函数。而父类的构造函数就失去了一些初始化的功能。这与子类的构造需要先完成父类的构造的流程相违背了。而这个后果会相当严重。

      2.虚函数的调用是需要通过“虚函数表”来进行的,而虚函数表也需要在对象实例化之后才能够进行调用。在构造对象的过程中,还没有为“虚函数表”分配内存。所以,这个调用也是违背先实例化后调用的准则。

      3.虚函数的调用是由父类指针进行完成的,而对象的构造则是由编译器完成的,由于在创建一个对象的过程中,涉及到资源的创建,类型的确定,而这些是无法在运行过程中确定的,需要在编译的过程中就确定下来。而多态是在运行过程中体现出来的,所以是不能够通过虚函数来创建构造函数的,与实例化的次序不同也有关系。

    那么虚够函数为什么可以设计成虚函数呢?由于虚函数是释放对象的时候才执行的,所以一开始也就无法确定析够函数的。而去由于析构的过程中,是先析构子类对象,后析构父类对象。所以,需要通过虚函数来指引子类对象。所以,如果不设置成虚函数的话,析构函数是无法执行子类的析构函数的

   所以,基于以上几点原因,构造函数是不能够设置成虚函数的,而析构函数是要设置成虚函数的。而且这个也是面试中会经常提及的考点。

相关文章推荐

为什么构造函数不能为虚函数

1,从存储空间角度     虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还...

C++中为什么构造函数不能为虚函数原因

1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来...

Java与C++在构造函数中调用虚函数时的区别

    别人问了我一个问题:若基类有一个虚函数init(),被构造函数调用,而派生类override了init(),同样在其构造函数中调用之,那么在创建一个派生类对象时,init()显然会依次被基类和...

STL学习——Hashtable篇

STL学习——Hashtable篇 概述hash table(散列表)是一种在插入,删除,搜索等操作“常数平均时间”完成的数据结构。它是一种字典结构。哈希函数是一种映射函数,它能够将大数映射为小数。负...

【深度探索 STL】hashtable(哈希表)

之前也学习过哈希表

C++中,为什么构造函数不能够是虚函数,而析构函数可以是虚函数,而且最好是虚函数

首先说一说构造函数不能够是虚函数的原因: 1、一个类有虚函数时,那么它就会对应着有一个虚表,这个虚表是存在在对象的内存空间的,所有虚函数的调用都要用到虚表,如果构造函数是虚的,那么他也就需要这个虚表...

C++中构造函数能调用虚函数吗?

环境:XPSP3 VS2005         今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: class Base { pu...

构造函数不能声明为虚函数的原因是:

解释一:所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是...

构造函数为什么不能是虚函数

1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来...

构造函数为什么不能是虚函数

本文的主题是构造函数不能是虚函数,首先这不需要你用脑子去记,因为当你写出来虚构造函数时,编译器是能检查出来的。本文的目的是为什么构造函数不能是虚函数。 首先,先看一段错误的代码,下面的代码是通不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么构造函数不能够使虚函数
举报原因:
原因补充:

(最多只允许输入30个字)