刚看了一道C++的编程题:遇到个问题,c++有些关系不是很熟,求各位指导指导:
解决时间 2021-03-15 11:15
- 提问者网友:酱爆肉
- 2021-03-14 13:09
#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对象的地址不一样....?
最佳答案
- 五星知识达人网友:低音帝王
- 2021-03-14 14:05
1 ClassC是classA和ClassB的子类,属于多重继承。
2 ClassC里有classA和classB。即:classC的对象里包含ClassA和ClassB的对象。
3 因此ClassC对象的首地址可以是ClassA对象的首地址也可以是classB对象的首地址。多态赋值时,编译器会找到对应对象的地址赋值出去。(两个父类对象存放总是有一定顺序,不能都在首地址覆盖存放,一个内存放两个数据明显不可能)。
4 如果我们切换多重继承的顺序,会发现pA和pC一样,而pB和pC的地址又不一样了。pA和pB当然永远不会一样。
总结:
1 多重继承时,子类的内存布局是根据继承顺序进行布局(注意:这个不是规范,各编译器编译的程序如有不同,也有可能)。
2 多重继承多态造型到父类指针时,父类指针指向符合自身数据的内存地址,并不是子类首地址。
全部回答
- 1楼网友:上分大魔王
- 2021-03-14 14:52
那地址是不一样的。只是你的输出有问题。pA和pB都是对象指针,指针表示的地址,地址形式是oxcccccccc,但是你却用%d输出,那是有问题的。另外,对象的概念不清晰,printf("%d\n",&aObject);这种写法很有问题,可以学习对象和指针。
- 2楼网友:一袍清酒付
- 2021-03-14 14:30
bitree *creatbitree(bitree *t)
问题出在这个函数里边
本函数在堆中分配了一块内存并让t(root)指向它(即修改了t的值),但root在函数返回后值又变回初始值。
可以改成这样:bitree *creatbitree(bitree* &t) 用引用的形式,返回后root的值不会改变。
ps: 1. 函数中t=new bitree; 应写在else的里边
我要举报
大家都在看
推荐资讯