菱形虚拟继承后,派生类的大小问题
#include<iostream.h>
class p
{private:
int pri1,pri2;
};
class D1: private p //virtual private p
{private:
int pri3;
};
class D2:public p //virtual public p
{private:
int pri4;
};
class D12:private D1,public D2
{ private:
int pri12;
};
void main()
{
cout<<sizeof(D1)<<' '<<sizeof(D2)<<' '<<sizeof(D12)<<endl;
}
结果是12,12,28(可以理解)
但是改为virtual private p和virtual public p后
结果是16,16,28
为什么???
问题点数:20、回复次数:7Top
1 楼steedhorse(晨星)回复于 2002-05-11 18:56:45 得分 5
多了个4字节的虚函数指针。Top
2 楼steedhorse(晨星)回复于 2002-05-11 18:57:28 得分 0
找一本讲的深一点的的C++书来看看吧。Top
3 楼wyylbl(清木子)回复于 2002-05-11 19:26:16 得分 0
to steedhorse(晨星)
D12的对象所占的28个字节里除了包含pri1,pri2,pri3,pri4,pri12这5个数据成员外,是否还包含2个虚函数指针?
Top
4 楼greening(逆风寒翎)回复于 2002-05-11 19:58:50 得分 5
各有一个4字节的指向Virtual table for p的可取名叫vptr指针。Top
5 楼c_antinomy(开始了,却没有感觉!)回复于 2002-05-11 20:02:20 得分 1
一般都与编译器的实现方式有一定关系。Top
6 楼coppermine(coppermine)回复于 2002-05-11 21:20:28 得分 8
简单的说, 通过虚拟继承实现的派生类即需要能够定位其共同基类
的位置, 又要实现各种多态操作,而且不能受派生类层次的影响, 因此对
共同基类的定位只有间接进行. 一般是通过一个指针,具体是指针直接定位还是指针指向一个表,由表中的某一项定位,就要看具体的实现了.
详细讨论可见inside c++ object modelTop
7 楼magicblue(小飞侠)回复于 2002-05-11 21:41:10 得分 1
to:steedhorse
你说的那个不叫虚函数指针……Top




