虚基表是在继承里面提到的概念 它存在的意义或者是目的是用来解决数据冗余和数据二义性的价值,在继承里面 尤其是菱形继承里面 从不同路径下继承而来的同一基类,会在子类里面有多份拷贝,将会存在两个问题 数据冗余和二义性的问题 当然如果是非要修改继承而来的值加上作用域也是可以实现的,在虚基表中存放的到虚基类的偏移量,虚基表也是以NULL结尾。
虚函数表有时候也称之为虚表 首先这个虚函数表他是存在哪里的呢 存在常量区的C++中的虚函数的实现一般是通过虚函数表(Virtual Table)来实现的。简称为V-Table。 这张表解决了继承、覆盖的问题,指明了实际所应该调用的函数。虚表可以看做一个指针数组,存放的是所有虚函数的指针,它以NULL来作为虚表的结束标志。
下面通过代码打印一下虚表
#include<iostream>
using namespace std;
class Person {
public:
Person()
{
cout << "Person_gou_zao" << endl;
}
virtual void Fun1()//final
{}
virtual void Fun2()//final
{}
private:
int _a = 0;
};
class Student:public Person {
public:
Student()
{
cout << "Student_gou_zao" << endl;
}
virtual void Fun1()override
{
cout << "Fun1" << endl;
}
virtual void Fun2()override
{
cout << "Fun2" << endl;
}
private:
int _id = 0;
};
typedef void(*VFP)();
void PrintVFTable(VFP a[])
{
int i = 0;
for (i = 0; a[i]; ++i)
{
cout << a[i] << endl;
a[i]();
}
}
int main()
{
Student stu;
PrintVFTable((VFP*)*(void**)&stu);
system("pause");
return 0;
}