用virtual声明类的成员函数称之为虚函数
用于实现多态
其中的关键就是两点:
想要理解其中的结构,还是要从内存布局看起
下面都是用debug的方式,查看其中的布局大小
一定要理解下面的四段代码
1,普通类的内存布局
代码:
因为普通函数并不占内存,所以此时对象a的并不显示内存
2,虚函数类的内存布局
代码:
此时因为类内定义了虚函数,所以就有了一个虚函数指针:_vfptr
这个函数指针指向的即为虚函数表,表内是两个虚函数的地址
3,子类不重写父类虚函数的内存布局
代码:
此时子类继承了父类的虚函数,但是没有重写,因此子类的虚函数指针指向的表中依然存放的父类的虚函数,因此也可以看到,里面的地址都是一样的
4,子类重写父类虚函数的内存布局
代码:
这个局部变量中可以看到,重写的函数虚函数表中的地址变了,没重写的函数,在虚函数表中的地址依然没变。
上面四幅图看懂就大概知道了虚函数表指针和虚函数表的关系了。
即当类中有虚函数时,就会自动产生一个虚函数表指针,这个指针指向一个虚函数表,表中就存放类中定义的虚函数
总结:
1,虚函数表指针
我们把对象首地址开始的4个字节或8个字节,这个位置我们称之为虚函数表指针(可以添加点属性看看位置)。它里面包含一个地址指向的就是虚函数表的地址
2,虚函数表
虚函数表里面是一组地址的数组(函数指针数组),他所在的位置就是虚函数表指针里面所存储的地址,它里面所包含的地址就是我们重写了父类的虚函数的地址(没有重写父类的虚函数那么默认的就是父类的函数地址)