首页 > 其他 > 详细

构造函数可以是虚函数吗?构造函数和析构函数可以调用虚函数吗?虚表和虚表指针的概念

时间:2020-04-28 21:27:52      阅读:74      评论:0      收藏:0      [点我收藏+]

构造函数不可以是虚函数。因为类的虚函数表指针是在构造函数中初始化的在虚表指针没有被正确初始化之前,我们不能调用虚函数

构造函数和析构函数也不能调用虚函数,前者是因为虚表指针还没有被初始化,后者是因为虚表指针可能已经被析构了。

0i

存在虚函数的类都有一个一维的虚函数表,简称虚表。类的每个对象都有一个指向虚表开始的虚表指针。虚表是和类对应的,虚表指针是和对象对应的。

抽象类是指至少包含一个纯虚函数的类。

编译器在编译的时候发现类里有虚函数就会为该类创建一个虚表。编译器另外还为每个类的对象提供一个虚表指针,这个指针指向对象所属的类的虚表。在虚表指针没有被正确初始化之前,我们不能调用虚函数。虚表的创建和虚表指针的初始化都是在构造函数中完成的

派生类的虚函数表存放重写的虚函数,当基类的指针指向派生类的对象时,调用虚函数时都会根据虚表指针来选择虚函数。 而基类的虚函数在派生类中已经被重写了,因此只能调用派生类的虚函数版本了。

**这也揭示了虚析构函数的作用,当基类指针指向派生类对象时,调用虚析构函数会先调用派生类的析构函数。如果析构函数不是虚函数,那么基类指针调用析构函数时只会调用基类的析构函数。

重载函数属于编译时多态,虚函数属于运行时多态。

构造函数可以是虚函数吗?构造函数和析构函数可以调用虚函数吗?虚表和虚表指针的概念

原文:https://www.cnblogs.com/conanpeng/p/12796371.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!