刘收获

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

C++多态实现原理

  C++多态的实现原理,一言以蔽之:在父类中存在虚函数(virtual),如果在子类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。由于虚函数的存在,编译器实行运行时绑定的机制,如果运行时实际指向的对象类型是子类的对象,就调用子类的虚函数;如果运行时实际指向的对象类型是父类的对象,就调用父类类的函数。

  


    1.虚函数
    虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖(Override)
 
     2.虚函数表

  编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4(x64下是N*8)的大小。
  派生类的虚函数表存放重写的虚函数,当基类的指针指向派生类的对象时,调用虚函数时都会根据vptr(虚表指针)来选择虚函数,而基类的虚函数在派生类里已经被改写或者说已经不存在了,所以也就只能调用派生类的虚函数版本了.
 
  3.虚表指针
  虚表指针在类对象中,每个同类对象中都有个一个vptr,指向内存中的vtable,所有同类对象,共享一个vtable,但是每个对象都自带一个vptr指向这个vtable,否则调用虚函数的时候会找不到正确的函数入口虚表指针是对象的第一个数据成员。
 (虚表(虚表存储在数据段)的地址存放在对象的起始位置,即对象的第一个数据成员就是它的虚表指针,同时注意到,虚表指针的初始化发生在构造函数过程中。)

 

  4.派生类的虚表中虚地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。

posted on   沉疴  阅读(194)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示