Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚拟继承中的vptr数_C++_Pointers_Virtual - Fatal编程技术网

C++ 虚拟继承中的vptr数

C++ 虚拟继承中的vptr数,c++,pointers,virtual,C++,Pointers,Virtual,我对虚拟继承中vptr的数量感到好奇。因此,我编写以下代码来了解VPTR的数量 class Base { public: virtual void A() { std::cout<<"Base::A()"<<std::endl; } }; class AnotherBase { public: virtual void B() { std::cout<<"AnotherBase::B()"<<std::endl; } }; cl

我对虚拟继承中vptr的数量感到好奇。因此,我编写以下代码来了解VPTR的数量

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;
 }
由于vptr,我不知道基的大小,Child1和Child2是4 为什么儿童3和儿童4的大小是8?(我怀疑是虚拟继承导致的vptr)
为什么孩子5的大小是12?(我不知道)
为什么Child6的大小是8(由于来自两个基类的VPTR)
为什么孩子7的大小是12?(我猜两个基类中的两个vptr各有8个,由于虚拟继承而增加了4个?
为什么孩子8的大小是12?(我不知道)

请解释这些问题

环境:64位Windows 7。Visual Studio 2012

我在GCC4.8.1上运行这段代码,我发现输出为

/* 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字节?

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

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

更多信息可在此处找到:

我在32位Windows 8.1和cygwin gcc 4.8.1中运行您的代码,结果如下:

Base    :4  
Child1  :4    
Child2  :4   
Child3  :4   
Child4  :4  
Child5  :4  
Child6  :8  
Child7  :8  
Child8  :8  

因此,可能这只是不同编译器与
g++(SUSE-Linux)4.7.2 20130108
之间的另一个实现差异,每种情况下我有8个。注意,你对
Child2::B()
Child5::B()
的计算是不正确的。每种情况下我也得到8分。我猜Caduchon使用的是像我一样的64位机器。这需要一些额外的限定或解释-
4
肯定是特定于编译器/平台/etc的。
Base    :4  
Child1  :4    
Child2  :4   
Child3  :4   
Child4  :4  
Child5  :4  
Child6  :8  
Child7  :8  
Child8  :8