1、单个类带虚函数的对象布局
当类含有虚函数时,在实例化对象时会产生一个虚函数表指针,这个虚函数表指针通常在对象的开头位置。
class Base {
public:
int x;
int y;
virtual void virFunc() { }
};
对象布局如下:
2、单一继承父类带虚函数的对象布局
(1) 父类带虚函数,子类不带虚函数
class Base {
public:
virtual void bvirFunc(){ }
protected:
int b_i;
};
class Derive : public Base{
private:
int d_i;
int d_j;
};
类Derive对象的布局如下:
(2) 如果子类也带虚函数
class Base {
public:
virtual void bvirFunc(){ }
protected:
int b_i;
};
class Derive : public Base{
public:
virtual void virFunc(){ }
private:
int d_i;
int d_j;
};
发现这时类Derive的对象布局跟不带虚函数时一样。在这种情况下子类会继承父类的虚函数表指针,但子类和父类各自都会有自己的虚函数表。
3、单一继续父类不带虚函数
class Base {
protected:
int b_i;
};
class Derived : public Base{
public:
virtual void virFunc(){ }
private:
int d_i;
int d_j;
};
这时虚函数表指针还是在类Derive对象开头的位置。