C++ vptr vtbl (C++虚表指针,虚函数表,虚函数的实现)很多人都喜欢问这个,写下吧。

#include <iostream>

class A {
  virtual void a()=0;
  virtual void b()=0;
};

class A1 : public A {
  virtual void a(){ std::cout<< "A1::a()" << std::endl; }
  virtual void b(){ std::cout<< "A1::b()" << std::endl; }

};
class A2 : public A {
  virtual void a(){ std::cout<< "A2::a()" << std::endl; }
  virtual void b(){ std::cout<< "A2::b()" << std::endl; }
};

typedef void (*F)();

int main()
{
  A1 a1;
  int* vptr = (int*)(&a1);
  int* vtbl = (int*)(*vptr);
   
  // 1.每个对象所在地址开始四个字节内存为vptr
  // 2.vptr内存中的内容为vtbl所在地址(vptr指向vtbl)
  // 3.vtbl中每四个字节保存着成员函数地址(vtbl每项指向成员函数)
  F a1_f1 = (F)*(vtbl + 0);
  F a1_f2 = (F)*(vtbl + 1);

  a1_f1();
  a1_f2();

  A2 a2;
  vptr = (int*)(&a2);
  vtbl = (int*)(*vptr);
   
  F a2_f1= (F)*(vtbl + 0);
  F a2_f2= (F)*(vtbl + 1);

  a2_f1();
  a2_f2();
}

你可能感兴趣的:(C++,Class,include)