虚拟继承中派生类对象的大小

Adi*_*rma 1 c++

class base
{
};

class der_1:public base
{
};

class der_2:virtual public base
{
};

int main()
{
    der_1 a;  //size of a is 1
    der_2 b;  //size of b is 4  ?? why
    cout<<sizeof(a)<<endl;
    cout<<sizeof(b)<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对象b内部包含虚拟指针,因此其大小为4而不是1(如a).但是这个虚拟指针指向什么?

Alo*_*ave 6

这完全取决于实现.这取决于实现如何实现动态调度/虚拟主义.这就是C++标准库提供的原因,sizeof以获得实际大小,以便您不必估计/估计它.始终使用它而不是对尺寸做出任何假设.

但是,大多数实现(全部读取)使用虚拟表和指针机制来实现此目的,您看到的额外4个字节大小用于vptr簿记.


Dav*_*rtz 5

它可能指向该类的虚函数表.在大多数实现中,这是必要的,以允许dynamic_cast工作.