虚函数:实现多态的机制,多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。让父类的指针有“多种形态”,一种泛型技术。

关键字:virtual

虚函数表:此表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其内容真实反映实际的情况。

在C++标准规格说明书中说到,编译器需要保证虚函数表的指针在于对象实例中最前面的位置。(保证正确取到虚函数的偏移量)

如何访问虚表?

class Base
{
public:
    virtual void fun1()
    {
        cout << "Base:fun1()" << endl;
    }
    virtual void fun2()
    {
        cout << "Base:fun2()" << endl;
    }
    virtual void fun3()
    {
        cout << "Base:fun3()" << endl;
    }
private:
    int x;
};
typedef void (*pFun)();

void main()
{
    Base b;
    cout <<hex<< *(int*)(&b) << endl;  //获得虚表指针
    pFun fun = (pFun)*(((int*)*(int*)(&b))+1); //获得虚表中函数的地址
    fun();
}

对虚函数、虚表的认识

解释:根据前面知识,我们得到类实例所占空间的前四个字节空间为虚表地址。故__vfptr = *(int*)(&b)表示虚表的地址;然后在虚表的结构中,每个函数的地址也占用四个字节空间。

Base:a() =*(((int*)(*(int*)(&b)))+0);

相关文章:

  • 2022-01-22
  • 2021-04-19
  • 2022-02-08
  • 2021-12-04
  • 2021-11-09
  • 2022-12-23
  • 2021-10-29
猜你喜欢
  • 2021-09-08
  • 2021-05-20
  • 2021-06-04
  • 2022-12-23
  • 2021-10-14
  • 2022-12-23
  • 2021-05-27
相关资源
相似解决方案