包含虚拟成员函数的类的大小

时间:2013-02-21 05:33:41

标签: c++ inheritance

我是C ++编程的新手,我怀疑包含虚拟成员函数的类的大小。请仔细阅读以下代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

class BaseClass
{
private:
    int a, b;
public:
    BaseClass()
    {
        a = 10;
        b = 20;
    }

    virtual int area()
    {
        return 0;
    }
};

class DerivedClass1 : public BaseClass
{
    int x;

public:
    virtual void simple()
    {
        cout << "inside simple" << endl;
    }
};

int main()
{
    DerivedClass1 Obj;
    cout << sizeof(Obj) << endl; // Displays 16 bytes

    return 0;
}

上面的代码显示大小为16个字节。根据我的说法,它应该显示20个字节,因为有两个虚拟指针(一个是从基类继承而另一个由于它自己的虚函数而被添加到派生类本身)+ Derived Class中的三个数据成员等于20个字节。所以请解释一下它是怎么回事......

1 个答案:

答案 0 :(得分:1)

在这种情况下,因为虚拟表指针在类层次结构中是通用的。因此,BaseClass已经具有虚函数,DeriveClass1中的附加虚函数不会添加任何类的大小。

这是你班级的记忆布局:

class DerivedClass1 size(16):
    +---
    | +--- (base class BaseClass)
 0  | | {vfptr}
 4  | | a
 8  | | b
    | +---
12  | x
    +---

Derivedass1::$vftable@:
    | &DerivedClass1_meta
    |  0
 0  | &BaseClass::area
 1  | &DerivedClass1::simple

在MVSC中编译时,可以使用-d1reportAllClassLayout选项来显示类的内存布局。