永发信息网

刚看了一道C++的编程题:遇到个问题,c++有些关系不是很熟,求各位指导指导:

答案:3  悬赏:80  手机版
解决时间 2021-03-15 11:15
#include
class ClassA
{
public:
virtual ~ClassA(){};
virtual void FunctionA(){};
};
class ClassB
{
public:
virtual void FunctionB(){};
};
class ClassC : public ClassA,public ClassB
{
public:
};
void main()
{
ClassC aObject;
ClassB* pB=&aObject;
ClassA* pA=&aObject;
ClassC* pC=&aObject;
printf("%d\n",pA);
printf("%d\n",pB);
printf("%d\n",pC);
printf("%d\n",&aObject);
}

为什么pA和pB对象的地址不一样....?
最佳答案
1 ClassC是classA和ClassB的子类,属于多重继承。
2 ClassC里有classA和classB。即:classC的对象里包含ClassA和ClassB的对象。
3 因此ClassC对象的首地址可以是ClassA对象的首地址也可以是classB对象的首地址。多态赋值时,编译器会找到对应对象的地址赋值出去。(两个父类对象存放总是有一定顺序,不能都在首地址覆盖存放,一个内存放两个数据明显不可能)。
4 如果我们切换多重继承的顺序,会发现pA和pC一样,而pB和pC的地址又不一样了。pA和pB当然永远不会一样。

总结:
1 多重继承时,子类的内存布局是根据继承顺序进行布局(注意:这个不是规范,各编译器编译的程序如有不同,也有可能)。
2 多重继承多态造型到父类指针时,父类指针指向符合自身数据的内存地址,并不是子类首地址。
全部回答
那地址是不一样的。只是你的输出有问题。pA和pB都是对象指针,指针表示的地址,地址形式是oxcccccccc,但是你却用%d输出,那是有问题的。另外,对象的概念不清晰,printf("%d\n",&aObject);这种写法很有问题,可以学习对象和指针。

bitree *creatbitree(bitree *t)

问题出在这个函数里边

本函数在堆中分配了一块内存并让t(root)指向它(即修改了t的值),但root在函数返回后值又变回初始值。

可以改成这样:bitree *creatbitree(bitree* &t) 用引用的形式,返回后root的值不会改变。

ps: 1. 函数中t=new bitree; 应写在else的里边

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
什么样的吸油烟机好?要吸力大的那种?
一间教室长8.6米,宽4.5米,用边长5分米的方砖
现在做包装最环保的材料是什么材料?
电脑不能正常识别麦克风
可浓奶茶地址在哪,我要去那里办事
东莞常平到深圳蛇口有多远?需要多长时间?
支付宝转账到自己的其他账号收费吗
深圳结婚证照片尺寸
幼儿园工作规程对我国学前教育发展有何意义
圆圆服装干洗店地址在什么地方,想过去办事,
我是男生,我的声音不是很粗,我唱男生的歌都
会场在哪里啊,我有事要去这个地方
5000元存一个月利息是百分之五应得到多少钱
求闪婚的小说搞笑的不要虐的
成金汽贸有限公司地址在什么地方,想过去办事
推荐资讯
文满地下家具批发城我想知道这个在什么地方
求一条自己很傻的说说!就像傻瓜一样傻!我会
怎么选购葡萄?
白裤子 白衬衫搭配什么外套比较好
昭通到江西要多少过路费
如果小鸟进屋子里有什么办法能让它飞走哦
长春市宽平大路小学一年级学费多少钱?
哥瑞和雷凌到底选哪一个
一年级大学季里喜欢宋妍霏还是葛洧吟?
独自一人第一次去南京的体验,不认路怎么办
怎样区别什么是剪力墙与砖墙?
做梦梦到钓鱼是条很大的鱼 有一人高 但是因为
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?