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对象开头的位置。

