首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟继承中的vptr数

虚拟继承中的vptr数
EN

Stack Overflow用户
提问于 2014-10-15 09:56:00
回答 1查看 125关注 0票数 3

我对虚拟继承中的vptr数量很好奇。因此,我编写了如下代码,以了解vptrs的数量。

代码语言:javascript
复制
class Base
{
    public: virtual void A() { std::cout<<"Base::A()"<<std::endl; }
};

class AnotherBase
{
    public: virtual void B() { std::cout<<"AnotherBase::B()"<<std::endl; }
};

class Child1 : public Base
{
    public: virtual void A() { std::cout<<"Child1::A()"<<std::endl; }
};

class Child2 : public Base
{
    public: virtual void B() { std::cout<<"Child2::B()"<<std::endl; }
};

class Child3 : public virtual Base
{

};

class Child4 : public virtual Base
{
    public: virtual void A() { std::cout<<"Child4::A()"<<std::endl; }
};

class Child5 : public virtual Base
{
    public: virtual void A() { std::cout<<"Child5::A()"<<std::endl; }
    public: virtual void B() { std::cout<<"Child5::B()"<<std::endl; }
};

class Child6 : public Base, public AnotherBase
{

};

class Child7 : public virtual Base, public AnotherBase
{

};

class Child8: public virtual Base, public virtual AnotherBase
{

};

int main() 
{
    using std::cout;
    cout<<"Base    :"<<sizeof(Base)<<std::endl;
    cout<<"Child1  :"<<sizeof(Child1)<<std::endl;
    cout<<"Child2  :"<<sizeof(Child2)<<std::endl;
    cout<<"Child3  :"<<sizeof(Child3)<<std::endl;
    cout<<"Child4  :"<<sizeof(Child4)<<std::endl;
    cout<<"Child5  :"<<sizeof(Child5)<<std::endl;
    cout<<"Child6  :"<<sizeof(Child6)<<std::endl;
    cout<<"Child7  :"<<sizeof(Child7)<<std::endl;
    cout<<"Child8  :"<<sizeof(Child8)<<std::endl;
    return 0;
 }

运行此代码后,我发现输出为

代码语言:javascript
复制
/* On Visual Studio 2012 */ 
Base    :4
Child1  :4
Child2  :4
Child3  :8
Child4  :8
Child5  :12
Child6  :8
Child7  :12
Child8  :12

由于vptr的缘故,我估计碱基、Child1和Child2都是4。

为什么Child3和Child4的大小是8?(我怀疑这是由于虚拟继承导致的vptr )

为什么Child5的大小是12?(我不知道)

为什么Child6大小为8(由于两个基类的vptrs )

为什么Child7的大小是12?(我猜来自两个基类的两个vptr各有8个,由于虚拟继承而增加了4个?)

为什么Child8的大小是12?(我不知道)

请解释这些问题。

环境: 64位Windows 7. Visual 2012

我在GCC 4.8.1上运行这个代码,我发现输出是.

代码语言:javascript
复制
/* On GCC 4.8.1 (Online)*/
Base    :8
Child1  :8
Child2  :8
Child3  :8
Child4  :8
Child5  :8
Child6  :16
Child7  :16
Child8  :16

现在我完全糊涂了。为什么基数是8字节?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 10:04:12

当我们使用虚拟继承时,该类中的虚拟基类指针将有4个字节(32位)或8个字节(64位)的开销。

每个类的总体大小取决于编译器的实现。

更多信息可以在这里找到:

http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26379574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档