c++的虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数
1. 无继承的情况
|
|
从上表可以发现:
1. 虚函数按照其声明顺序放于表中。
2. 父类的虚函数在子类的虚函数前面。
3. 继承,虚函数覆盖的情形
|
从上表可以看出:
1. 覆盖的f()函数被放到了虚表中原来父类虚函数的位置。
2. 没有被覆盖的函数依旧。
3. 可通过获取获取成员函数指针来调用成员函数(即使是private类型的),带 来一定安全性的影响。
4. 多继承的情形
|
从上表可以看出:
1. 每个父类都有自己的虚表。
2. 子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)
3. 对于多继承无虚函数覆盖的情况,布局与上图类似(Derive的位置对应Base)。