21xrx.com
2024-09-20 00:00:56 Friday
登录
文章检索 我的文章 写文章
C++虚函数表的存储位置是什么?
2023-07-02 02:28:58 深夜i     --     --
C++ 虚函数 存储位置

C++是一种多范式编程语言,其中最常见的是面向对象编程(OOP)范式。面向对象编程的主要特征之一是继承,而继承过程中涉及到虚函数的概念。虚函数是在一个基类中定义的函数,它可以被派生类重载,并在运行时动态绑定。

在C++中,虚函数的实现是通过虚函数表来实现的。虚函数表(VTable)是一个存储函数指针的表,存储位置在编译器生成的代码中的数据段(Data Segment)中。虚函数表包含类对象的虚函数指针,它们按照虚函数的定义顺序依次存储。当调用虚函数时,实际上是通过虚函数指针找到了对应的函数,并进行调用。

虚函数表的存储位置可以通过反汇编代码来验证。下面是一个简单的代码示例:


#include <iostream>

class Base {

public:

  virtual void print()

    std::cout << "This is Base class." << std::endl;

  

};

class Derived : public Base {

public:

  void print()

    std::cout << "This is Derived class." << std::endl;

  

};

int main() {

  Base* b = new Derived();

  b->print();

  return 0;

}

该示例中定义了一个基类Base和一个派生类Derived,派生类中重载了基类的虚函数。在主函数中,通过向上转型(Upcasting)将Derived类的对象指针赋给了基类指针。调用基类指针的虚函数时,会动态绑定到Derived类中的重载函数。

编译并反汇编该代码示例,可以看到虚函数表的存储位置:


004022A8 55         push    ebp 

004022A9 8B EC        mov     ebp,esp 

004022AB 83 EC 18      sub     esp,18h 

004022AE C7 45 FC 03 00 00 mov     dword ptr [ebp-4],3 

004022B5 E8 46 00 00 00   call    00402300 

004022BA 8B 45 FC      mov     eax,dword ptr [ebp-4] 

004022BD 8B 10        mov     edx,dword ptr [eax] 

004022BF 8B 52 04      mov     edx,dword ptr [edx+4]  ; 这里获取到了虚函数表的地址

004022C2 8B 00        mov     eax,dword ptr [eax] 

004022C4 FF E2        jmp     edx 

可以看到,在反汇编代码的最后一行中,使用了虚函数表中存储的函数指针进行了跳转。由此可见,虚函数表的存储位置在编译器生成的代码中的数据段(Data Segment)中。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复