评论

收藏

[C++] #yyds干货盘点#构造函数为什么不能是虚函数

编程语言 编程语言 发布于:2021-12-26 21:38 | 阅读数:346 | 评论:0

构造函数为什么不能是虚函数
执行虚函数需要借助虚指针vptr,虚指针指向虚函数表,而虚指针在构造函数中初始化,虚指针还没有初始化,就不能执行虚函数,虚构造函数和虚指针是矛盾的。
析构函数有时必须是虚函数的原因
一个类作为基类被继承时,析构必须是虚函数。如果基类的析构函数不是虚函数,当使用基类指针指向派生类时,delete基类指针,只有基类的析构函数被调用,基类指针中的派生类的部分的内存没有释放。
虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义,所以构造函数没有必要是虚函数
虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象的时候自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不是虚函数。
它们内部能否调用虚函数
调用自然是可以,只不过构造函数中的虚函数不具有多态性,不能达到我们想要的效果
虚函数表是什么时候生成的,虚函数表地址是什么时候给对象的;虚表指针是在构造函数之前就给了对象了
虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址

  • 首先,虚函数表在编译时候就已经确定;
  • 对象在构造前就已经分配好内存,在进入构造函数之前就已经将虚函数表地址给了对象了
  • 进一步的,虚函数表给对象,在初始化列表之前
  • 我们都知道初始化列表先于构造函数体实现
顺序如下:

  • 构造父类
  • 将子类虚函数表地址给子类对象
  • 初始化列表进行初始化
  • 构造函数本体



关注下面的标签,发现更多相似文章