C++中派生的类,用new怎么分配空间,急!

时间:2022-08-17 18:54:13
如:
class B0       
{
int nV;
public:
B0(int a){nV=a;cout<<"Member of B0"<<endl;}
B0(){nV=0;cout<<"B0's default constructor called."<<endl;}
int GetnV(){return nV;}
void fun(){cout<<"fun of B0"<<endl;}
};

class B1 : virtual public B0
{
int nV1;
public:
B1(int a,int b):B0(a){nV1=b;cout<<"Member of B1"<<endl;}
int GetnV1(){return nV1;}
void funB1(){cout<<"funB1 of B1"<<endl;}
};

class B2 : virtual public B0
{
int nV2;
public:
B2(int a,int b):B0(a){nV2=b;cout<<"Member of B2"<<endl;}
B2(){nV2=0;cout<<"B2's default constructor called."<<endl;}
int GetnV2(){return nV2;}
void funB2(){cout<<"funB2 of B2"<<endl;}
};

class D:public B2,public B1
{
int nD;
public:
D(int a,int b,int j):B0(a),B1(a,b)
{
nD=j;
cout<<"Member of D"<<endl;
}
void funD(){cout<<"funD of D"<<endl;}
int GetnD(){return nD;}
};

int main()
{
D d(1,2,4);
int i,j;
           D *p;
p=new D(3,4,6);
d.funD();
cout<<"d.GetnV()"<<d.GetnV()<<endl;
cout<<endl;
           //cout<<(*p).GetnV()<<endl;
           //cout<<(*p).GetnV1()<<endl;
           //cout<<"(*p).GetnV2()"<<(*p).GetnV2()<<endl;
cout<<"(*p).GetnD()="<<(*p).GetnD()<<endl;
i=sizeof(*p);
j=sizeof(int);
cout<<endl;
cout<<"i="<<i<<endl;
cout<<"j="<<j<<endl;
    return 0;
}
这里i的值是24了,是怎么分配空间的。先在这里谢谢各位大侠了。

12 个解决方案

#1


1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4   
1个vptr 4
1个占位字节 + 3 内存对齐

建议你看看 inside the c++ object model

#2


1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4  
2个pointer to B0

#3


哦 对 
是 2个指针指向同1地址
引用 2 楼 pengzhixi 的回复:
1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4  
2个pointer to B0

#4


虚继承有多种实现方法
总是静不下心来 好好看看 inside the c++ object model 关于 虚继承 的部分。。

#5


才学C++不久,看不懂~~~~~~~~
mark

#6


[img=http://b76.photo.store.qq.com/http_imgload.cgi?/rurl4_b=c01eb0c759b1f221ad238d8c9b68ef355ac5a7556e3c159780463e630b1fc80d331bfd3c553ef4b8e453ff191f9ed63e389ae14872aaa1aba09db4c1540ceff3addf9e3feee6275c20809ace37cfa9ad8ae78d6b&a=76&b=76][/img]
楼上两位大侠能不能解释下关于 这个问题的的 这个图

#7


晕 图破了~~~~不晓得怎么上图真烦~自己画下把,就是用vs 监视变量的截图~~~
-   p
|--    B2   
|  |--    B0
|  |  |--    nV
|  |------nV2 
|--    B1     
|  |--    B0
|  |  |--    nV
|  |------nV1
|--    nD               画的真难看不晓得看的懂不~~~ 

#8


mark,学习下

#9


呵呵,临时翻了下书,根据介绍多重继承当 产生上面所示的“菱形”时  子类对象里会有俩基类的对象,如果楼主不知道,那怎会在 b1 b2 继承 b0时用 virtual 继承了,
::>_<:: 虚继承 还没怎么理解~~~~~暂时只知道是为了解决  D类中的向上映射时 俩相同基类对象相冲突用的~~~~~还不晓得是否对~~~~~~
希望楼下有大侠详细说明下 多重继承  需要注意的地方~~~~

#10


mark 学习下

#11


引用 2 楼 pengzhixi 的回复:
1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4  
2个pointer to B0

还是2楼这位大侠牛啊,昨晚整了一晚上,今天上午又整了一上午,终于觉得差不多了~~~~~感觉好兴奋~
终于弄明白那俩指针哪来的了,原来是虚继承中就产生了,B1和B2 的对象中会保存 1个 nv  1个nv1(nv2) 和一个指向虚基类的指针 所以就有12个字节~  当 D 多重继承 B1 B2的时候 由于只会产生一个 虚基类(B)的对象的拷贝(nv)  所以 D 的对象中 就会是 2楼所说的内存分配模式~ 

#12


MARK

#1


1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4   
1个vptr 4
1个占位字节 + 3 内存对齐

建议你看看 inside the c++ object model

#2


1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4  
2个pointer to B0

#3


哦 对 
是 2个指针指向同1地址
引用 2 楼 pengzhixi 的回复:
1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4  
2个pointer to B0

#4


虚继承有多种实现方法
总是静不下心来 好好看看 inside the c++ object model 关于 虚继承 的部分。。

#5


才学C++不久,看不懂~~~~~~~~
mark

#6


[img=http://b76.photo.store.qq.com/http_imgload.cgi?/rurl4_b=c01eb0c759b1f221ad238d8c9b68ef355ac5a7556e3c159780463e630b1fc80d331bfd3c553ef4b8e453ff191f9ed63e389ae14872aaa1aba09db4c1540ceff3addf9e3feee6275c20809ace37cfa9ad8ae78d6b&a=76&b=76][/img]
楼上两位大侠能不能解释下关于 这个问题的的 这个图

#7


晕 图破了~~~~不晓得怎么上图真烦~自己画下把,就是用vs 监视变量的截图~~~
-   p
|--    B2   
|  |--    B0
|  |  |--    nV
|  |------nV2 
|--    B1     
|  |--    B0
|  |  |--    nV
|  |------nV1
|--    nD               画的真难看不晓得看的懂不~~~ 

#8


mark,学习下

#9


呵呵,临时翻了下书,根据介绍多重继承当 产生上面所示的“菱形”时  子类对象里会有俩基类的对象,如果楼主不知道,那怎会在 b1 b2 继承 b0时用 virtual 继承了,
::>_<:: 虚继承 还没怎么理解~~~~~暂时只知道是为了解决  D类中的向上映射时 俩相同基类对象相冲突用的~~~~~还不晓得是否对~~~~~~
希望楼下有大侠详细说明下 多重继承  需要注意的地方~~~~

#10


mark 学习下

#11


引用 2 楼 pengzhixi 的回复:
1个nv0 4
1个nv1 4
1个nv2 4
1个nd 4  
2个pointer to B0

还是2楼这位大侠牛啊,昨晚整了一晚上,今天上午又整了一上午,终于觉得差不多了~~~~~感觉好兴奋~
终于弄明白那俩指针哪来的了,原来是虚继承中就产生了,B1和B2 的对象中会保存 1个 nv  1个nv1(nv2) 和一个指向虚基类的指针 所以就有12个字节~  当 D 多重继承 B1 B2的时候 由于只会产生一个 虚基类(B)的对象的拷贝(nv)  所以 D 的对象中 就会是 2楼所说的内存分配模式~ 

#12


MARK