• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c++ 搞代码 4年前 (2022-01-06) 13次浏览 已收录 0个评论

这篇文章主要介绍了C++虚函数的实现机制分析,需要的朋友可以参考下

本文针对C++的虚函数的实现机制进行较为深入的分析,具体如下:

1、简单地说,虚函数是通过虚函数表实现的。那么,什么是虚函数表呢?
事实上,如果一个类中含有虚函数,则系统会为这个类分配一个指针成员指向一张虚函数表(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、可以看出,虚函数表既有继承性,又有多态性。每个派生类的vtbl继承了它各个基类的vtbl,如果基类vtbl中包含某一项,则派生类的vtbl中也将包含同样的一项,但是两项的值可能不同。如果派生类覆盖了该项对应的虚函数,则派生类vtbl的该指针先指向重载后的虚函数,没有重载的话,则沿用基类的值。

3、在类对象的内存布局中,首先是该类的vtbl指针,然后才是对象数据。在通过对象指针调用一个虚函数时,编译器生成的代码将先获取对象类的vtbl指针,然后调用vtbl中对应的项。对于通过对象指针调用的情况,在编译期间无法确定指针指向的是基类对象还是派生类对象,或者是哪个派生类的对象。但是在运行期间执行到调用语句时,这一点已经确定,编译后的调用代码能够根据具体对象获取正确的vtbl,调用正确地虚函数,从而实现多态性。

4、分析一下这里的思想所在:
问题的实质是这样,对于发出虚函数调用的这个对象指针,在编译期间缺乏更多的信息,而在运行期间具备足够的信息,但那时已不再进行绑定了,怎么在二者之间做一个过渡呢?
把绑定所需的信息用一种通用的数据结构记录下来,该数据结构来源gao@daima#com搞(%代@#码网可以同对象指针相联系,在编译时只需要使用这个数据结构进行抽象的绑定,而在运行期间将会得到真正的绑定。这个数据结构就是vtbl。可以看到,实现用户所需的抽象和多态需要进行后绑定,而编译器又是通过抽象和多态实现后绑定的

以上就是C++虚函数的实现机制分析的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C++虚函数的实现机制分析

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址