C++中的虚函数是怎么实现的

C++中的虚函数是如何实现的
如果我们定义一个对象:
class Student
{
public:
...
  virsual void show();
  int x;
...
};
然后:
Student stu1;
那么编译器在编译时就会在data段或者栈中分配一块的长度为sizeof(student)的空间,然后:
stu1.x = 1;
编译器就会找到stu1的这段空间的首地址,再运算出.x的偏移地址进行赋值,然后:
stu1.show();
因为定义stu1时使用的是类Student,编译器会根据class Student的声明跳到student::show()函数的首地址,并将对象stu1的首地址作为this指针传给Student::show()

此时,再声明:
class Graduate:public Student;
{
...
  void show();
...
}
Graduate grad;
Student *stup;
stup = &grad;
会将grad的首地址通过运算找到基类Student的部分的首地址,并改变指针类型为Student*以后赋值给stup
stup->x = 2;
这个没有问题,通过stup的地址,再根据Student声明运算出x的地址即可
但是,
stup->show()
是什么原理找到Graduate::show()的呢?

------解决方案--------------------
在你采用virtual ,会创建一个vtabl和一个vptr,这个指针会指向你的vtabl,派生类是通过vptr去查找这个virtual所重写的方法.
------解决方案--------------------
指针+表格+位偏移