C++规定了虚函数的行为,但是将实现交给了编译器的作者.
通常,编译器处理虚函数的方法是给每一个对象添加一个隐藏成员.隐藏成员中保存了一个指向函数地址数组的指针.
这个数组称为虚函数表(virtual function table,vtbl).虚函数表中存储了为类对象进行声明的虚函数的地址.
例如:基类对象包含一个指针,该指针指向基类的虚函数表.
派生类对象包含一个指针,该指针指向一个独立...
分类:
编程语言 时间:
2014-06-22 17:06:32
阅读次数:
239
虚函数:虚函数机制的实现是通过虚函数表和指向虚函数表的指针(存放在对象的空间中)来完成的。
1)空间方面:每个类只用一个虚函数表的拷贝,故其占用的空间不是很大。
2)时间方面:虚函数的调用开销包括两次整型加法和一次指针间接引用的开销。
其动态绑定的实现步骤如下:
(a)根据对象的虚指针VPtr找到该对象对应的虚函数表VTable,所需的开销仅是一次偏移量调整(整型加法)加上一次指针间接运算...
分类:
其他好文 时间:
2014-06-15 14:35:31
阅读次数:
251
定义为 virtual的 函数是基类期待派生类(derived class)重定义的,
基类期待 派生类继承的函数不能定义为虚函数。动态绑定:程序能 使用继承层次中任意类型的对象,无需关心对象的具体类型。
使用这些类的程序无须区分函数在基类还是在继承类中定义的。尽管不是必须,派生类一般会重定义基类中...
分类:
其他好文 时间:
2014-06-12 23:23:06
阅读次数:
518
这篇博客“http://blog.csdn.net/haoel/article/details/1948051/”比较深度介绍了虚函数表解析。C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让...
分类:
编程语言 时间:
2014-06-12 20:06:06
阅读次数:
446
深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮。
但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?
书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个...
分类:
其他好文 时间:
2014-06-08 20:02:33
阅读次数:
197
C++虚函数表解析陈皓http://blog.csdn.net/haoel前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了...
分类:
编程语言 时间:
2014-05-21 23:56:48
阅读次数:
507
从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过
vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。从使用角...
分类:
编程语言 时间:
2014-05-21 19:34:01
阅读次数:
178
虚继承和虚基类 虚继承:在继承定义中包含了virtual关键字的继承关系;
虚基类:在虚继承体系中的通过virtual继承而来的基类,需要注意的是:class CSubClass : public virtual CBase {};
其中CBase称之为CSubClass的虚基类,而不是说CBa.....
分类:
其他好文 时间:
2014-05-13 18:15:46
阅读次数:
435
问题:
包含一个以上虚函数的 class B, 它所定义的 对象是否共用一个虚函数表?
分析: 由于含有虚函数,因此对象内存包含了一个指向虚函数表的指针,但是这个指针指向的是同一个虚函数表吗?
实验如下:
{CSDN:CODE:338780}
结论:
结果表面,同一个类的所有对象,都共享同一个虚函数表。
派生问题:
派生类 和 基类是否共享同一个虚函...
分类:
编程语言 时间:
2014-05-11 22:35:00
阅读次数:
387