2013-02-21 51 views
0

我是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个字节。所以请给我解释一下它是怎么回事......

+0

继承虚拟指针_and_添加另一个?为什么会发生? – jogojapan 2013-02-21 05:38:02

+2

阅读[虚拟表](http://en.wikipedia.org/wiki/Virtual_method_table) – borisbn 2013-02-21 05:38:04

+1

如果您有多个继承,则只有其他vptrs才会出现。另外,您的实验结果非常依赖于编译器和平台;当[使用g ++编译](http://liveworkspace.org/code/10xj5R$10)时,它会输出24,与构建64位可执行文件时的VS2012一样。 – Praetorian 2013-02-21 05:52:00

回答

1

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

这是你的类的内存布局:

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

Derivedass1::[email protected]: 
    | &DerivedClass1_meta 
    | 0 
0 | &BaseClass::area 
1 | &DerivedClass1::simple 

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

+0

派生类函数是否有可能变大? – 2015-06-05 19:38:03

+0

当BaseClass没有任何虚函数时,但是在DeriveClass中有一个或多个虚函数。在这种情况下,与BaseClass相比,DerivedClass中的vfptr(4bytes)更多(不包含vfptr)。 – HappyTran 2015-06-06 04:08:45