源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C++虚函数的实现机制分析

  • 时间:2022-09-23 06:34 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++虚函数的实现机制分析
本文针对C++的虚函数的实现机制进行较为深入的分析,具体如下: 1、[b]简单地说,虚函数是通过虚函数表实现的[/b]。那么,什么是虚函数表呢? 事实上,如果一个类中含有虚函数,则系统会为这个类分配一个指针成员指向一张虚函数表(vtbl),表中每一项指向一个虚函数的地址,实现上就是一个函数指针的数组。 例如下面这个例子:
class Parent
{
public:
 virtual void foo1() { }
 virtual void foo1() { }
 void foo1();
};

class Child1
{
public:
 void foo1() { }
 void foo3();
};

class Child2
{
public:
 void foo1() {}
 void foo2() {}
 void foo3();
};

下面列出了各个类的虚函数表(vtbl)的内容。 Parent类的vtbl:Parent::foo1( )的地址、Parent::foo1( )。 Child1类的vtbl:Child1::foo1( )的地址、Parent::foo1( )。 Child2类的vtbl:Child1::foo1( )的地址、Child2::foo1( )。 2、可以看出,[b]虚函数表既有继承性,又有多态性[/b]。每个派生类的vtbl继承了它各个基类的vtbl,如果基类vtbl中包含某一项,则派生类的vtbl中也将包含同样的一项,但是两项的值可能不同。如果派生类覆盖了该项对应的虚函数,则派生类vtbl的该指针先指向重载后的虚函数,没有重载的话,则沿用基类的值。 3、[b]在类对象的内存布局中,首先是该类的vtbl指针,然后才是对象数据[/b]。在通过对象指针调用一个虚函数时,编译器生成的代码将先获取对象类的vtbl指针,然后调用vtbl中对应的项。对于通过对象指针调用的情况,在编译期间无法确定指针指向的是基类对象还是派生类对象,或者是哪个派生类的对象。但是在运行期间执行到调用语句时,这一点已经确定,编译后的调用代码能够根据具体对象获取正确的vtbl,调用正确地虚函数,从而实现多态性。 4、分析一下这里的思想所在: 问题的实质是这样,对于发出虚函数调用的这个对象指针,在编译期间缺乏更多的信息,而在运行期间具备足够的信息,但那时已不再进行绑定了,怎么在二者之间做一个过渡呢? 把绑定所需的信息用一种通用的数据结构记录下来,该数据结构可以同对象指针相联系,在编译时只需要使用这个数据结构进行抽象的绑定,而在运行期间将会得到真正的绑定。这个数据结构就是vtbl。可以看到,实现用户所需的抽象和多态需要进行后绑定,而编译器又是通过抽象和多态实现后绑定的
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部