我对虚拟继承中的vptr数量很好奇。因此,我编写了如下代码,以了解vptrs的数量。
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;
}运行此代码后,我发现输出为
/* 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上运行这个代码,我发现输出是.
/* 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字节?
发布于 2014-10-15 10:04:12
当我们使用虚拟继承时,该类中的虚拟基类指针将有4个字节(32位)或8个字节(64位)的开销。
每个类的总体大小取决于编译器的实现。
更多信息可以在这里找到:
http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible
https://stackoverflow.com/questions/26379574
复制相似问题