C++中虚函数表存储位置浅析

来源:互联网 发布:类似知否的高质量 编辑:程序博客网 时间:2024/06/06 08:30

关于C++中虚函数表,我们知道这样一些事实:

1. 当class中存在virtual函数时,编译器会为这个class追加一个void** __vfptr数据成员。

2. C++程序运行时,实际函数的调用,是通过查询__vfptr来获取的,从而实现多态。

3. 多态的实现,必须用指针或引用才能实现,拷贝对象或转换对象是无法实现的。


基于以上事实,我理解:

C++中虚函数表存储位置,是class,不是object。


当程序编译时,编译器为每个class分配了虚函数表 vtable(class),存储位置应该是无法修改的常量区域 。

创建对象时,根据对象类型,为对象中void** __vfptr(object)赋值。

对象转换时,根据对象类型,重写对象中void** __vfptr(object)。

指针或引用不涉及对象转换。


反过来,只有void** __vfptr存储在class时,才能符合上面的事实。


以上是2016/7/15面试题引发的思考,也是我的第一篇博客,请大家多多指教。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 恐怖黎明铁匠选错怎么办 堡垒之夜草变色怎么办 火柴没有擦的了怎么办 乙醚倒进下水道了怎么办 乙醚和水不分层怎么办 乙醚闻多了头晕怎么办 爱乐维吃了便秘怎么办 刮完滑石粉墙面很软怎么办 被硫酸泼到皮肤怎么办 头磕了一下头晕怎么办 家里有事与工作不能请怎么办 撞了头头晕想吐怎么办 猫不小心摔一下怎么办 一氧化二氮中毒怎么办 电脑开机变慢了怎么办 怎么办抚顺韦德健身卡 预售健身卡合法吗怎么办 被浓硫酸泼到怎么办 婴儿误喝了生水怎么办 宝宝喝了生水拉肚子怎么办 因妈妈喝生水宝宝拉肚子怎么办 喝了几口生水怎么办 不小心吃到蟑螂怎么办 吃了有蛆的樱桃怎么办 不小心误食了蛆怎么办 吃了有蟑螂的汤怎么办 调节天平时指针向右怎么办 香薰蜡烛融化了怎么办 香薰蜡烛挂壁怎么办y 粗蜡烛只烧中间怎么办 紫薯馒头变绿怎么办 小孩手开水烫了怎么办 被油烫伤了怎么办才不留疤 烫伤水泡蹭破了怎么办 烧伤的水泡破了怎么办 烧伤后水泡破了怎么办 烫伤泡破了红肿怎么办 烧伤第二天水泡破了怎么办? 烧伤后换药特别疼怎么办 盐酸溅到皮肤上怎么办 磷性磷酸酶高440怎么办