构造函数不能声明为虚函数的原因及分析

 更新时间:2020年4月25日 17:44  点击:1754

1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。

2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。

3. 构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象的类型,尽管我们可能通过实验室的基类的指针或引用去访问它但析构却不一定,我们往往通过基类的指针来销毁对象。这时候如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。

4. 从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有必要成为虚函数。

5. 当一个构造函数被调用时,它做的首要的事情之一是初始化它的VPTR。因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码——既不是为基类,也不是为它的派生类(因为类不知道谁继承它)。所以它使用的VPTR必须是对于这个类的VTABLE。而且,只要它是最后的构造函数调用,那么在这个对象的生命期内,VPTR将保持被初始化为指向这个VTABLE, 但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置VPTR指向它的 VTABLE,等.直到最后的构造函数结束。VPTR的状态是由被最后调用的构造函数确定的。这就是为什么构造函数调用是从基类到更加派生类顺序的另一个理由。但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置VPTR指向它自己的VTABLE。如果函数调用使用虚机制,它将只产生通过它自己的VTABLE的调用,而不是最后的VTABLE(所有构造函数被调用后才会有最后的VTABLE)。

[!--infotagslink--]

相关文章

  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25
  • C#中构造函数和析构函数用法实例详解

    这篇文章主要介绍了C#中构造函数和析构函数用法,结合实例形式详细分析了C#中构造函数与析构函数的原理、定义、使用方法与相关注意事项,需要的朋友可以参考下...2020-06-25
  • 浅谈C++ 虚函数

    这篇文章主要介绍了C++ 虚函数的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下...2020-09-14
  • JavaScript精炼之构造函数 Constructor及Constructor属性详解

    除了创建对象,构造函数(constructor) 还做了另一件有用的事情―自动为创建的新对象设置了原型对象(prototype object) 。原型对象存放于 ConstructorFunction.prototype 属性中。例如,我们重写之前例子,使用构造函数创建...2015-11-08
  • 一文读懂C++ 虚函数 virtual

    这篇文章主要介绍了C++ 虚函数 virtual的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-24
  • 浅谈js构造函数的方法与原型prototype

    下面小编就为大家带来一篇浅谈js构造函数的方法与原型prototype。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-06
  • ASP.NET私有构造函数用法分析

    这篇文章主要介绍了ASP.NET私有构造函数用法,较为详细的分析了ASP.NET中私有构造函数的特性及具体用法,需要的朋友可以参考下...2021-09-22
  • C#中私有构造函数的特点和用途实例解析

    这篇文章主要介绍了C#中私有构造函数的特点和用途,需要的朋友可以参考下...2020-06-25
  • 解析C++编程中virtual声明的虚函数以及单个继承

    这篇文章主要介绍了C++编程中virtual声明的虚函数以及单个继承,剖析虚函数和单个基类所能够继承的成员,要的朋友可以参考下...2020-04-25
  • 深入解析C++中的虚函数与多态

    对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)和一个指向虚函数表的指针(vptr)来实现的...2020-04-25
  • 详解C++纯虚函数与抽象类

    这篇文章主要介绍了C++纯虚函数与抽象类的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下...2020-08-13
  • C++构造函数和析构函数的使用与讲解

    今天小编就为大家分享一篇关于C++构造函数和析构函数的使用与讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-04-25
  • C++聚合关系类的构造函数的调用顺序详解

    下面小编就为大家带来一篇C++聚合关系类的构造函数的调用顺序详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧...2020-04-25
  • 简单介绍php构造函数用法

    构造函数意思就是在类执行时通过构造函数作为入口进行操作了,我们下面来看一篇关于php构造函数用法吧。 构造函数 和 析构函数 构造函数 void __construct ([ mi...2016-11-25
  • 虚函数被类的构造析构函数和成员函数调用虚函数的执行过程

    虚函数被类的构造析构函数和成员函数调用虚函数的执行过程,需要的朋友可以参考下...2020-04-25
  • C++中复制构造函数和重载赋值操作符总结

    这篇文章主要介绍了C++中复制构造函数和重载赋值操作符总结,本文对复制构造函数和重载赋值操作符的定义、调用时机、实现要点、细节等做了总结,需要的朋友可以参考下...2020-04-25
  • C++中构造函数的参数缺省的详解

    这篇文章主要介绍了C++中构造函数的参数缺省的详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下...2020-04-25
  • C++中构造函数重载

    这篇文章主要介绍了C++中构造函数重载的相关资料,十分的详细,需要的朋友可以参考下...2020-04-25
  • C#中派生类调用基类构造函数用法分析

    这篇文章主要介绍了C#中派生类调用基类构造函数用法,实例分析了派生类调用基类构造函数的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 浅析C#静态类,静态构造函数,静态变量

    这篇文章主要介绍了浅析C#静态类,静态构造函数,静态变量 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下...2020-06-25