当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-21

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

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

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

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

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

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


    
 
 

您可能感兴趣的文章:

  • C++ Strings(字符串) 成员 Constructors:构造函数,用于字符串初始化
  • 一个父类的构造函数的参数是(Applet applet),请问它的子类构造函数当中应怎样调用父类构造函数?
  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • 请问师傅们这个类为什么没有构造函数呀?什么样的类不需要构造函数?
  • 哈希函数的构造方法及举例
  • 学习C#中的静态构造函数与复制构造函数
  • Python类的构造函数,析构函数以及垃圾回收机制详细介绍及代码举例
  • 构造函数、析构函数能否缺省?
  • 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
  • 高分请教:怎样在Kdevelop不能够Trace构造函数?(其他函数可以Trace)
  • 有关Java构造函数的问题之一——缺省性
  • php构造函数与析构函数
  • 调用另一个构造函数方法
  • C#私有构造函数的简单例子
  • php构造函数与析构函数初探
  • C# 静态构造函数使用总结
  • Bean的构造函数问题
  • java构造函数示例(构造方法)
  • 对象数组的构造函数调用问题
  • 关于构造函数的一道题
  • 构造函数
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 Constructors:构造器
  • 构造方法到底怎么用,构造方法体中可以放些什么东西,它和一般方法有什么本质区别功能上
  • mongodb是哪个公司的以及它的内部构造
  • java类构造器的调用时机?
  • linux 下 gdb 如何调试类构造
  • c# 引用类型构造器
  • c# 值类型实例构造器
  • 有关构造器和方法的问题
  • 谁愿意给我讲讲构造器的用途,谢谢!
  • 一个有私有构造方法的类为什么不可以被extends?
  • java继承中的构造方法实例解析
  • 有关构造器的问题??
  • jQuery的Widget构造器 Fluqi
  • 请问什么是JAVA的构造器。
  • 怎么在java中构造collection
  • 请问子类能不能重构父类的构造方法,如果能,怎么做?
  • Git 上的 wiki 构造工具 Gollum
  • 构造器也可以带public吗?volatile怎么用?
  • 非静态初始化模块和构造器的区别?
  • 构造器的内容
  • struct 也有构造器吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3