社区
C++ 语言
帖子详情
构造函数执行在前,还是虚表指针覆盖在前?
ngbbxt
2013-01-23 09:36:13
一个类有虚函数。那么,
类的对象在生成的时候,是先执行构造函数,还是先给虚表指针赋值?
...全文
198
3
打赏
收藏
构造函数执行在前,还是虚表指针覆盖在前?
一个类有虚函数。那么, 类的对象在生成的时候,是先执行构造函数,还是先给虚表指针赋值?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xumaojun
2013-01-23
打赏
举报
回复
问题研究的太深了,学习一下
ngbbxt
2013-01-23
打赏
举报
回复
准确来说,应该是给虚表指针赋值吧,而不是给虚表赋值吧? 虚表是编译生成后,就存在了吧?
引用 1 楼 akirya 的回复:
先把当前类的虚表赋值
珍惜生命远离CPP
2013-01-23
打赏
举报
回复
先把当前类的虚表赋值
最全的C和C++语言笔试面试题汇总
最全的C和C++语言笔试面试题汇总,我大四时候找工作时候他帮上了很多忙,里面的题目经常考到。希望对大家有帮助。
为什么
构造函数
不能声明为虚函数?
自己总结: 1.当创建一个子类对象时,如果将
构造函数
声明为虚函数,因为子类在构造时,会先调用父类的够造函数,但是子类已经
覆盖
了基类的
构造函数
(因为是虚函数),所以也就无法进一步
执行
,导致程序出错。 2.虚函数需要通过虚函数
指针
指向一个虚函数表,当将
构造函数
声明为虚函数,在创建对象时,首先要调用
构造函数
,然后
构造函数
是虚函数,就需要用虚函数
指针
去调用,但是,对象都还没构造,也就没有虚函数
虚函数,虚
指针
,
虚表
,虚析构函数和多态
而且,只要它是最后的
构造函数
调用,那么在这个对象的生命期内,VPTR将保持被初始化为指向这个VTABLE, 但如果接着还有一个更晚派生的
构造函数
被调用,这个
构造函数
又将设置VPTR指向它的 VTABLE,等.直到最后的
构造函数
结束。多态,就是存在虚函数的基类和存在一个或者多个基于该基类(并且实现了该基类的虚函数)的派生类,当一个基类
指针
指向不同的派生类时,通过基类
指针
调用虚函数,会有不同的实现,从而实现虚函数的多态性质。当使用基类
指针
或引用调用虚函数时,实际调用的是指向派生类的虚函数表的相应虚函数。
一篇文章理清C++对象创建、构造、析构和虚函数
指针
的关系
对象和变量是在编译时就确定内存大小的,但同时也在编译期间确定该类没有虚函数,则会进行内存优化,不实际分配虚函数
指针
的内存空间。运行时,对象是先创建的,然后再分配内存。系统为对象的非静态成员变量与vptr(虚函数
指针
)分配内存,并且在内存空间中,会先安放vptr(虚函数
指针
),但是此时的虚函数
指针
并未赋值当调用
构造函数
,在
构造函数
执行
过程中,会将vptr指向正确的虚函数表,从而绑定对象和其虚函数。对于没有虚函数的类,vptr可以为null或指向一个共享的空虚函数表。
虚函数表
构造函数
面试的时候被问到,
构造函数
中能不能为虚函数,
构造函数
中能不能调用虚函数的问题,被问蒙了,查了点资料记录下, 为什么
构造函数
不能使虚函数: 一、
构造函数
不能为虚函数的理由: 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果
构造函数
是虚的,就需要通过 vtable来调用,可是对象还没有实
C++ 语言
65,199
社区成员
250,520
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章