春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0

有这么一个关于虚函数和虚继承的问题,如下:
class A
{
    char k[3];
public:
    virtual void aa();
};

class B: public virtual A
{
    char j[3];
public:
    virtual void bb();
};

class C: public virtual B
{
    char i[3];
public:
   virtual void cc();
};
请问sizeof(A), sizeof(B), sizeof(C)分别为多少?

对于A, 我们很清楚的知道,其大小为8。
对于B,考虑到虚继承和自身的虚函数,我们也可以算出来起大小为8+8+4 = 20
对于C,其大小为20+8+4 = 32。
其中 4为虚继承所占用的指针。

这个看上去没有什么问题。但是当我把虚继承去掉以后,这里却有了一些变化?
首先,我猜想了一下,A是8,B是16,C是24。
可惜结果和我想的不一样,答案是8, 12, 16。很有规律的一个数字。
从A到B,只增加了4。什么原因呢?

http://www.diybl.com/course/3_program/c++/cppjs/2007927/74925.html这里介绍了一些

The existence of virtual function(s)

Existence of virtual function(s) will add 4 bytes of virtual table pointer in the class, which will be added to size of class. Again, in this case, if the base class of the class already has virtual function(s) either directly or through its base class, then this additional virtual function won't add anything to the size of the class. Virtual table pointer will be common across the class hierarchy. That is

class Base {

public:

 ...        

virtual void SomeFunction(...);

private:  

int iAMem

};

class Derived : public Base

{

 ...       

 virtual void SomeOtherFunction(...);

private:      

int iBMem

};

In the example above, sizeof(Base) will be 8 bytes--that is sizeof(int iAMem) + sizeof(vptr). sizeof(Derived) will be 12 bytes, that is sizeof(int iBMem) + sizeof(Derived). Notice that the existence of virtual functions in class Derived won't add anything more. Now Derived will set the vptr to its own virtual function table.


派生类和基类拥有相同的虚函数表。

但似乎虚继承的时候,又摈弃了这一做法。

所以两个是有所区别的。

posted on 2009-10-07 22:43 Sandy 阅读(1935) 评论(2)  编辑 收藏 引用 所属分类: c++学习

FeedBack:
# re: 虚函数与虚继承的思考[未登录]
2009-10-07 23:23 | vincent
orz..您一定看了程序员面试宝典这本书  回复  更多评论
  
# re: 虚函数与虚继承的思考
2010-06-18 09:31 | 小时候可靓了
虚继承是个很神奇的东西,貌似不同的编译器的实现都有区别。但非虚继承一般都差不多。。 子类、父类共享虚表,子类实现了的虚函数,就重填到虚表中,没有的就不填,这样当我们通过父类调用的时候,自然就调用到了。虚继承则有点麻烦。。。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理