一、虚指针及虚表的概念
首先要清楚,所谓指针其实质就是一个内存地址值,形如0x12345678;
其次,要知道,函数名本身就是一个地址;
虚指针:其实就是一个地址值,以该地址为起始地址的一片内存单元存放着各虚函数的入口地址,这一片内存单元合起来就称为虚函数表(想象一下:一片内存单元存着许多函数地址,想执行哪个虚函数就来这片内存单元查找该虚函数的入口地址,就像查表一样,故称虚函数表)。经过以上解释,可以发现,所谓虚指针,就是个指向指针的指针。
二、C++内存布局模型
我们在程序一般可以通过两种方式生成一个变量(注意这里的变量是广义的变量):一种是通过类型来生成(如 int a;Derived d);一种是通过new来申请内存并生成(如 Base * p = new Derived())。要知道的是,两种方式生成的变量在内存中是存放在不同的地方的:前一种方式生成的变量是存放在栈(stack)中的,而后一种方式生成的变量是存放在堆(heap)中的。栈是向下生长的(向地址减小的方向生长),也就是说晚生成的变量所在的地址比早生成的变量的地址要小(举例:int a;Derived d;因d生成时间晚于a,故 &a > &d);堆则相反,是向上生长的。稍后会在第三部分结合代码来理解