虚拟函数实现的机制
来源:互联网 发布:网络安全法考试题库 编辑:程序博客网 时间:2024/05/14 08:18
1 每一个类产生出一队指向虚函数的指针,放在一个表格之中。这个表格被称为虚函数表(Vtbl)。
2 每一个对象被编译器添加了一个指针,指向相关的虚函数表。通常这个指针被称为Vptr。Vptr的设置(setting)和重置(resetting)由每一个类的构造函数(constructor)、析构函数(destructor)和拷贝赋值(copy assignment)运算符自动完成。每一个类所关联的type_info object(用以支持运行时类型识别,即RTTI)也通过虚函数表指出来,通常放在虚函数表的第一个记录中。
3 在继承的情况下,派生类会为每个有虚函数的基类添加一个vptr。(存在多个虚拟表指针,类级别上有多个虚拟表,对应不同的基类)
4 子类的成员函数被放到了第一个父类的表中。
转自:http://hi.baidu.com/05104106/blog/item/040712ad28da19014a36d655.html
如果对象有一个或多个虚函数,编译器将一个隐藏的指针放入对象,该指针称为vptr。这个vptr指向一个全局表,该表称为vtbl。在分发一个虚函数时,运行时系统跟随对象的vptr找到类的vtbl,然后跟随vtbl中适当的项找到方法的代码。
vtbl属于类,并且只有含虚函数类在构造函数初始化列表后生成,每个类只有一个。
vptr属于上述类的对象,实例化时在对象头部产生(这样才能计算偏移量以定位覆盖),每有一个含虚函数基类就多4个字节,并且每个对象拥有一个或更多(每个虚函数基类对象的Slicing拥有一个)。故用sizeof()来测试空数据成员对象,32位系统中大小为4或其倍数(产生vptr,本质为指针)。
注意Slicing应用。派生类继承基类的vtbl,并依照基类virtual函数的新定义作改写。用基类指针或引用调用虚函数时,将使用派生对象对应切片的vptr,实现多态。这也是虚函数动态联编速度慢的原因,它不象普通函数一样寻址,而是通过vptr->vtbl->slot地址调用。
- 虚拟函数实现的机制
- 虚拟字符驱动函数的实现
- C++中虚拟函数的内存分配机制
- C++虚拟函数实现
- C++虚拟函数实现
- hypercall的实现机制与硬件虚拟化
- 虚函数的实现机制
- 内联函数的实现机制
- 虚函数的实现机制
- 虚函数的实现机制
- 虚函数的实现机制
- 虚函数的实现机制
- 虚函数的实现机制
- 虚函数的实现机制
- 函数重载的实现机制
- 虚函数的实现机制
- 虚函数的实现机制
- 虚函数的实现机制
- sb的类型重定义错误 redefinition of ‘class
- 程序员特有的9个坏习惯
- Shell Script Utility To Read a File Line By Line
- Java串口通信总结
- JAVA读写串口Bean范例
- 虚拟函数实现的机制
- JavaScript学习(7)利用表单获取数据
- 今天装上了VS2010
- 我的激情 怎么了!
- 一位软件工程师的6年总结_I'm a C fans!(转载)
- 定制 SWT/RCP 界面:如何编写一个漂亮的 SWT/RCP 界面
- 儿童腕式手机
- 12个用一条语句写成的有关日期函数
- 三种找每个客户最小订单的写法