1.虚函数表与多态
在面向对象时:封装、继承、多态(如何体现的)
虚函数:
虚函数表:
虚函数表指针:
1.1 什么是虚函数表
class A{
}a;
此时sizeof(a)=1;//类成员为空时,也占用1个字节
class A{
public :
void func1(){};
void func2(){};
}a;
此时sizeof(a)=1;//类的普通成员函数不占用类对象的内存空间
class A{
public :
void func1(){};
void func2(){};
virual void vfunc(){};//虚函数表指针 void *vptr;占用4个字节
}a;
此时sizeof(a)=4;//x86平台为4,x64平台为8,
当一个类中的虚函数大于1个时,内存中会生成一个虚函数表
1.2 虚函数表指针与虚函数表之间的关系
有虚函数的类在编译的时候,编译器回想类A的构造函数
中添加vptr(虚函数表指针的)赋值语句。(类似:vptr = &A::vftable)
在类被创建对象时,会执行构造函数,此时vptr(虚函数表指针)被赋值虚函数表的地址(&A::vftable),此时虚函数表指针被指向类A的vtbl(虚函数表)
1.3 类对象在内存中的形式
class A{
public :
void func1(){};
void func2(){};
virual void vfunc1(){};
virual void vfunc2(){};
virual ~A(){};
private:
int m_a;
int m_b;
}a;
此时sizeof(a)=4+4+4,因为无论多少个虚函数,只产生一个虚函数表指针(x86是4Byte,x64是8Byte),该指针指向虚函数表。然后有两个int类型数据,占用两个4Byte
1.4 虚函数的工作原理、多态性的体现
多态性:父类函数写虚函数,子函数进行重写父类虚函数实现时,父类指针指向子类对象,此时调用虚函数,实际上是调用的子类的函数。
多态必须存在虚函数,没有虚函数,绝不可能存在多态。