请教大学C++中的一道题,求过程

如题所述

关于图片的解释:如果把一个derive1对象或derive2对象的内存地址赋给base类型的指针p,那么derive1对象或derive2对象的内存空间将会发生截断。也就是编号为2的空间将被抛弃,只保留编号为1的内存空间。因为p认定的内存空间只有一个“格子”,而derive1和derive2有两个“格子”!就像把一个int 型变量的值赋给char型变量一样,int型变量的一部分二进制位会被截断,因为char型变量空间小,容纳不了int型变量。要注意的是:如果子类的who()是虚函数,那么又是另外一种情况,便不能用这个图片解释了!


此题涉及“继承时,父类与子类之间同名函数的覆盖”问题。

derive1类和derive2类都继承于base类。由于函数名、返回值一样,所以这两个子类在继承父类时,base类的who()函数被其两个子类的who()函数覆盖了。

函数的覆盖,并不是把父类的who()函数排挤掉、删除掉,而是子类对象在调用who()时,调用的是子类的who();但是,父类的who()函数在内存空间中仍然存在。

所以,derive1和derive2的内存空间有2个who()函数。如图!如果在derive1或derive2内,想要强行调用它们父类的who()函数,可以用base::who()的形式。

如:

void derive1::who()

{

   base::who();

}

这表明,在内存中确实存在2个who()函数的代码空间!一个是父类的,一个是子类的。

故而,覆盖真正的含义是,被覆盖的函数仍然存在,但子类对象默认调用自己新创建的函数。

第一行输出容易理解。把base对象的内存地址赋给base指针,调用的自然是base对象的who()函数。

第二、三行输出便有些疑惑了!把子类对象,obj2、obj3赋给指针p,照理说,父类的who()被覆盖了,应该调用子类的who()才对,为什么调用的却是父类的who()呢?

因为p是base类型的指针,于是p指针认定的内存模型是base类的内存模型,而base类的内存模型中只有一个who(),也就是base类的who(),所以调用的是base类的who()。

第四、五行输出也容易理解。因为子类的who()覆盖了父类的who(),所以调用的是子类的who()。

追问

谢谢你!

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-01-15
输出结果是:
base class
base class
base class
derive1 class
derive2 class
说明:fun函数的形参是base *型指针,主函数中3个fun的调用后两行的实参都要被强制为base *型,所以3次p->who()调用都是调用类base的who()函数输出base class。最后2行不用说也明白。

请教大学C++中的一道题,求过程
关于图片的解释:如果把一个derive1对象或derive2对象的内存地址赋给base类型的指针p,那么derive1对象或derive2对象的内存空间将会发生截断。也就是编号为2的空间将被抛弃,只保留编号为1的内存空间。因为p认定的内存空间只有一个“格子”,而derive1和derive2有两个“格子”!就像把一个int 型变量的值...

大学C++问题。答案是ABA~B~A~A.求过程。
A是B的父类 创建B对象obj,首先会调用父类A的构造函数(先有爸爸,再有儿子),然后调用B的构造函数;因此A->B 在B的构造函数中创建一个A对象,因此A构造函数再次调用,因此A->B->A;程序结束,B对象obj首先调用自己的析构函数,因此A->B->A->~B;B的析构函数中释放A对象,调用A的析构函...

一个C++大作业的问题。
age 25 > ! exp 5 > && kick 100 > || 计算表达式(后缀)的值时由左向右读去 1.如果是操作数则直接跳过向后取.2.如果是操作符,则操作符和前面的操作数进行运算,得到的结果放在首部.3.持续1,2步直到表达式处理完成。比如: age > 25 && exp > 5 --> age 25 > exp 5 > && 处理过...

c++第十七题。求详细过程
if((k+m)%s) \/\/意思是只要得数不为0,就跳过这次循环体,重新开始 continue;观察k m 和s的初始值, k+m=5 5%s得数为0。 也就是if条件为假,不执行continue;而是执行++m;和k--; 注意每次循环都是m+1和k-1,所以循环完后k+m始终都为5,也就是说无论循环多少次都不会执行...

问一个C++的简单问题
也就是形参。由于新生成了一个sample类的实例,所以必须调用构造函数,而在调用构造函数时传的值就是s3。意思是通过s3构造了H,所以调用了sample类的复制构造函数,也就是sample(const sample& H)构造函数。完整的过程是:sample H = sample(s3);s1.plus(H)其中,H是plus函数的局部变量。

C++里面 a=3 (++a)+(++a)+(++a)=? 求详细解答过程
可以先加一个括号((++a)+(++a))+(++a);然后第一个(++a),可得a=4;再求第一个+法,但是加数是++a,++的运算优先级高于+,所以先算++a,于是得a=5 再看这第一个+法,其实是变量a+a,这个时候的a其实是5,于是执行+法,5+5=10 第一个+法的运算结果是10 再看第二个+法,第二个...

C++程序 求解这道题怎么解答··· 主要是想知道过程· · 求详细详细...
由题可知,分母规律为2*n-1,且n为奇数为负,否则为正。因此结果为0.82093462093462088+1\/23-1\/25

一道C++题目,求解答
!x得到0,y++得到1,此时y为1,x=y,所以x=y=1.y+=x++,先给y加上x得到2,再让x加1得到2,所以xy均为2 由于总语句中为或关系,且有一个为1,所以最外层括号内的表达式为1 所以括号输出1 所以整体为1

求解一道C++程序分析题 及详细解题过程
虽然&num=&unm[0],但&unm+1是不等于&unm [0]+1的,而是等于&unm[0]+(元素个数-1)+1 (int *)是强制将地址转型;不改变地址的值 所以(int*)(&num+1)的值等于&unm[0]+(元素个数-1)+1 ((int*)(&num+1)-1)等于&unm[0]+(元素个数-1) 等于 &num[3]...

【C++编程题】求大佬帮忙 求详细过程 万分感谢 急!!!
按下列要求编写程序 (1)从键盘输入若干名学生数据包括学号、姓名、三门课成绩),计算每位学生的总分,将原有数据和计算出的总分存入二进制文件stu.bin。 (2)从二进制文件stu.bin中依次输入每个学生的数据和该数据在 stu.bin文件中的位置指针值(即索引),按总分降序排序后,将已排序的学生数据的...

相似回答
大家正在搜