虚函数表和虚表指针

1,虚函数的含义

用virtual声明类的成员函数称之为虚函数

2,作用

用于实现多态

  1. 存在继承关系,子类继承父类
  2. 子类重写了父类的virtual function
  3. 子类以父类的指针或者引用的身份出现

3,虚函数的实现原理

其中的关键就是两点:

  • 虚函数表指针
  • 虚函数表

想要理解其中的结构,还是要从内存布局看起

下面都是用debug的方式,查看其中的布局大小

一定要理解下面的四段代码


1,普通类的内存布局

代码:

虚函数表和虚表指针_第1张图片

因为普通函数并不占内存,所以此时对象a的并不显示内存


2,虚函数类的内存布局

代码:

虚函数表和虚表指针_第2张图片

此时因为类内定义了虚函数,所以就有了一个虚函数指针:_vfptr

这个函数指针指向的即为虚函数表,表内是两个虚函数的地址


3,子类不重写父类虚函数的内存布局

代码:

虚函数表和虚表指针_第3张图片

此时子类继承了父类的虚函数,但是没有重写,因此子类的虚函数指针指向的表中依然存放的父类的虚函数,因此也可以看到,里面的地址都是一样的


4,子类重写父类虚函数的内存布局

代码:

虚函数表和虚表指针_第4张图片

这个局部变量中可以看到,重写的函数虚函数表中的地址变了,没重写的函数,在虚函数表中的地址依然没变。

上面四幅图看懂就大概知道了虚函数表指针和虚函数表的关系了。

即当类中有虚函数时,就会自动产生一个虚函数表指针,这个指针指向一个虚函数表,表中就存放类中定义的虚函数

总结:

1,虚函数表指针

  • 什么是虚函数表指针,他在哪里,有什么用?

       我们把对象首地址开始的4个字节或8个字节,这个位置我们称之为虚函数表指针(可以添加点属性看看位置)。它里面包含一个地址指向的就是虚函数表的地址

2,虚函数表

  • 什么是虚函数表,他又在哪里,有什么用

        虚函数表里面是一组地址的数组(函数指针数组),他所在的位置就是虚函数表指针里面所存储的地址,它里面所包含的地址就是我们重写了父类的虚函数的地址(没有重写父类的虚函数那么默认的就是父类的函数地址)

你可能感兴趣的:(C/C++学习,指针,c++)