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
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
1个nv1 4
1个nv2 4
1个nd 4
2个pointer to B0
#3
哦 对
是 2个指针指向同1地址
是 2个指针指向同1地址
#4
虚继承有多种实现方法
总是静不下心来 好好看看 inside the c++ object model 关于 虚继承 的部分。。
总是静不下心来 好好看看 inside the c++ object model 关于 虚继承 的部分。。
#5
才学C++不久,看不懂~~~~~~~~
mark
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 画的真难看不晓得看的懂不~~~
- p
|-- B2
| |-- B0
| | |-- nV
| |------nV2
|-- B1
| |-- B0
| | |-- nV
| |------nV1
|-- nD 画的真难看不晓得看的懂不~~~
#8
mark,学习下
#9
呵呵,临时翻了下书,根据介绍多重继承当 产生上面所示的“菱形”时 子类对象里会有俩基类的对象,如果楼主不知道,那怎会在 b1 b2 继承 b0时用 virtual 继承了,
::>_<:: 虚继承 还没怎么理解~~~~~暂时只知道是为了解决 D类中的向上映射时 俩相同基类对象相冲突用的~~~~~还不晓得是否对~~~~~~
希望楼下有大侠详细说明下 多重继承 需要注意的地方~~~~
::>_<:: 虚继承 还没怎么理解~~~~~暂时只知道是为了解决 D类中的向上映射时 俩相同基类对象相冲突用的~~~~~还不晓得是否对~~~~~~
希望楼下有大侠详细说明下 多重继承 需要注意的地方~~~~
#10
mark 学习下
#11
还是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
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
1个nv1 4
1个nv2 4
1个nd 4
2个pointer to B0
#3
哦 对
是 2个指针指向同1地址
是 2个指针指向同1地址
#4
虚继承有多种实现方法
总是静不下心来 好好看看 inside the c++ object model 关于 虚继承 的部分。。
总是静不下心来 好好看看 inside the c++ object model 关于 虚继承 的部分。。
#5
才学C++不久,看不懂~~~~~~~~
mark
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 画的真难看不晓得看的懂不~~~
- p
|-- B2
| |-- B0
| | |-- nV
| |------nV2
|-- B1
| |-- B0
| | |-- nV
| |------nV1
|-- nD 画的真难看不晓得看的懂不~~~
#8
mark,学习下
#9
呵呵,临时翻了下书,根据介绍多重继承当 产生上面所示的“菱形”时 子类对象里会有俩基类的对象,如果楼主不知道,那怎会在 b1 b2 继承 b0时用 virtual 继承了,
::>_<:: 虚继承 还没怎么理解~~~~~暂时只知道是为了解决 D类中的向上映射时 俩相同基类对象相冲突用的~~~~~还不晓得是否对~~~~~~
希望楼下有大侠详细说明下 多重继承 需要注意的地方~~~~
::>_<:: 虚继承 还没怎么理解~~~~~暂时只知道是为了解决 D类中的向上映射时 俩相同基类对象相冲突用的~~~~~还不晓得是否对~~~~~~
希望楼下有大侠详细说明下 多重继承 需要注意的地方~~~~
#10
mark 学习下
#11
还是2楼这位大侠牛啊,昨晚整了一晚上,今天上午又整了一上午,终于觉得差不多了~~~~~感觉好兴奋~
终于弄明白那俩指针哪来的了,原来是虚继承中就产生了,B1和B2 的对象中会保存 1个 nv 1个nv1(nv2) 和一个指向虚基类的指针 所以就有12个字节~ 当 D 多重继承 B1 B2的时候 由于只会产生一个 虚基类(B)的对象的拷贝(nv) 所以 D 的对象中 就会是 2楼所说的内存分配模式~
#12
MARK