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

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

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

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

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

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

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

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

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

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

C++中为什么构造函数不能定义为虚函数

关于C++为什么不支持虚拟构造函数,Bjarne很早以前就在C++Style and Technique FAQ里面做过回答 Avirtual call is a mechanism to get ...
  • shilikun841122
  • shilikun841122
  • 2018年01月09日 14:43
  • 22

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

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

C++:构造函数和析构函数能否为虚函数

C++:构造函数和析构函数能否为虚函数?简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。(1) 构造函数不能为虚函数让我们来看看大牛C++之父 Bjarne Stroustrup 在《...
  • xhz1234
  • xhz1234
  • 2010年11月06日 00:36
  • 12902

C/C++—— C++中构造函数不能是虚函数的原因分析

首先:到底能不能将构造函数声明为虚函数?答案是不能。
  • Linux_ever
  • Linux_ever
  • 2016年04月04日 14:08
  • 1502

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

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

为什么构造函数不能声明为虚函数,析构函数可以

构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。 不建议在构造函数和析构函数里面调用虚函数。 构造函数不能声明为虚函数的原因是: 1 构造一个对象的时候,必须...
  • chen825919148
  • chen825919148
  • 2012年09月26日 13:34
  • 13669

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

[C++基础]047_构造函数为什么不能是虚函数 本文的主题是构造函数不能是虚函数,首先这不需要你用脑子去记,因为当你写出来虚构造函数时,编译器是能检查出来的。本文的目的是为什么构造...
  • jiafu1115
  • jiafu1115
  • 2013年12月17日 13:54
  • 1060

虚函数/纯虚函数,以及构造函数不能是虚函数原因

1.首先要了解什么是虚函数:      简单地说,那些被virtual关键字修饰的成员函数,就是虚函数(实现多态)。          作用:指向基类的指针在操作它的多态类对象时,会根据不同的类对象,...
  • qq_33854260
  • qq_33854260
  • 2017年07月15日 11:26
  • 167

构造函数能不能是虚函数

最近有人问构造函数能不能是虚函数:当然不能解释一下: 1,从存储空间角度         虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构...
  • woyaowenzi
  • woyaowenzi
  • 2008年04月21日 09:38
  • 14732

为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数

1、为什么构造函数不可以是虚函数 ①从存储空间角度     虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通...
  • zhang2531
  • zhang2531
  • 2016年04月22日 10:53
  • 1897
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么构造函数不能够使虚函数
举报原因:
原因补充:

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