帮忙解释这段c++语言
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了帮忙解释这段c++语言相关的知识,希望对你有一定的参考价值。
#include<iostream.h>
class location
public:
location(float b ,float c )
x=b;y=c;
~location()
float area()
return 0;
float get_x()return x;
float get_y()return y;
private:
float x,y;
;
class circle: virtual public location
public:
circle(float a,float b,float c):location(b,c),radius(a)
~circle()
float area()
s1=3.14*radius*radius;
return s1;
void put(circle A)
cout<<"圆的位置:"<<A.get_x()<<","<<A.get_y()<<endl;
private:
float radius,s1;
;
class Rectangle:virtual public location
public:
Rectangle(float a,float b ,float c,float d):location(c,d),high(a),wide(b)
~Rectangle()
float area()
s2=high*wide;
return s2;
void put(Rectangle B)
cout<<"矩形的位置:"<<B.get_x()<<","<<B.get_y()<<endl;
private:
float high ,wide,s2;
;
class cylinder:public circle ,public Rectangle
public:
cylinder(float a,float b,float c,float d):location(c,d),circle(a,c,d),Rectangle(2*3.14*a,b,c,d)
~cylinder()
float area(cylinder C)
s3=2*C.circle::area()+C.Rectangle::area();
return s3;
void put(cylinder D)
cout<<"圆柱的位置:"<<D.get_x()<<","<<D.get_y()<<endl;
private:
float s3;
;
void main()
circle m(1,3,4);
cout<<"圆的面积:"<<m.area()<<endl;
m.put(m);
Rectangle n(1,2,3,4);
cout<<"矩形的面积:"<<n.area()<<endl;
n.put(n);
cylinder o(1,5,3,4);
cout<<"圆柱的面积:"<<o.area(o)<<endl;
o.put(o);
o.circle::put(o);
o.circle::area();
o.Rectangle::area();
o.put(o);
就是我要给老师讲这段,我一点儿不会,哪位能帮下忙,追加悬赏,谢谢!
circle和Rectangle都是虚继承于location的子类
cylinder则多继承了circle和Rectangle,上一步为什么是虚继承?就是因为cylinder同时继承了circle和Rectangle,如果不采用虚继承,则cylinder在访问location类的成员时,会产生二义性,无法确定应该访问那个参数。采用虚继承,location在cylinder中就只有一个副本,去除了二义性。
和类同名的那俩函数,不带~的是构造函数,功能是构造一个类的实例(对象)并完成相应的初始化。带~的是析构函数,实在对象生命周期结束时,自动调用,将占用的内存等资料释放。
float area() return 0; 这是计算面积的方法 子类都继承了这个方法,不过各自对其进行了重定义,因为不同图形的面积计算方法不同,重定义时的函数名和参数及返回值类型必须和基类中的一摸一样才能将基类的方法覆盖。
float get_x()return x; x是private的成员,对象直接是不能访问到的,所以添加此访问函数,作为接口。
float get_y()return y; 同理
如果基类没有提供无参构造函数,那么子类的构造函数都必须通过初始化列表的方式调用基类的有参构造函数。调用基类构造函数的顺序跟初始化列表中写的先后顺序五官,只与基类被继承的先后顺序有关。
main函数中类似于 circle m(1,3,4);的语句,都是定义对应类的实例,即对象。括号中的参数则是调用构造函数时传递的参数。 参考技术A printf(“========*** 主菜单 ***=========\n“); //这个打印控制台的。以下printf都是输出控制台内容
printf(“ 1. 输入职工记录\n“);
printf(“ 2. 查询职工记录\n“);
printf(“ 3. 修改职工记录\n“);
printf(“ 4. 删除职工记录\n“);
printf(“ 5. 输出职工记录\n“);
printf(“ 6. 调查工资情况\n“);
printf(“ 7. 追加职工记录\n“);
printf(“ 8. 结束使用\n“);
printf(“ 0. 退出系统\n“);
printf(“\n“);
printf(“*** 欢迎使用职工档案管理系统 ***\n“);
printf(“请选择(0-8):\n“);
scanf(“%d“,&x); //这个是接受用户输入的方法。%d是参数类型,&x输入值
switch(x) //这个是根据X选择的方法。也就是控制流语句
case 1: input();break; //当X=1的时候,则执行input方法。遇到break中断后面的case操作。以下的一样
case 2: search();break;
case 3: modi();break;
case 4: dele();break;
case 5: output();break;
case 6: stat();break;
case 7: run();break;
case 8: fun();break;
default:printf(“\n Wrong!“); //这个是当X不符合1-8的数字时候,输出的内容
if(x==0)break; //跟上面的case一样的
void input() //用户自定义的方法
FILE *fp; //声明指针
int n,i; //声明变量
//fopen函数用来打开一个文件,其调用的一般形式为:
//文件指针名=fopen(文件名,使用文件方式);
// 其中,
// “文件指针名”必须是被说明为FILE 类型的指针变量;
// “文件名”是被打开文件的文件名;
// “使用文件方式”是指文件的类型和操作要求。
// “文件名”是字符串常量或字符串数组。
if ((fp=fopen(“emp“,“wb“))==NULL) //这个函数是C里面内置的
printf(“不能建立emp文件\n“);
exit(1); //当不能建立文件是终止后续操作
printf(“输入职工人数:“);
scanf(“%d“,&n);
printf(“输入格式:职工号\t 姓名\t 性别\t 工龄\t 工资<Enter>\n“);
for(i=0;i<n;i++) /* 循环获取n个职工记录 */ //循环语句控制流。i是语句控制变量,i++在每循环一次后自动加1,i<n这个不用解释了吧
printf(“第%d个职工:“,i+1);
scanf(“%s%s%s%d%d“,emp[i].no,emp[i].name,emp[i].sex,
&emp[i].year,&emp[i].salar); //%s是字符串的格式 %d是整形的格式
for(i=0;i<n;i++) /*将n个职工记录写入文件*/
fwrite(&emp[i],sizeof(struct employee),1,fp); //写入文件内容,C内置的方法
fclose(fp); //关闭文件操作,也是C内置的
/*************************统计模块**********************/
void stat( ) //同样是个自定义方法
FILE *fp;
int n,num;
if((fp=fopen(“emp“,“rb“))==NULL)
printf(“不能打开emp文件\n“);
exit(1);
printf(“工资数:“);
scanf(“%d“,&num);
printf(“记录号 职工号\t 姓名\t 性别\t 工龄\t 工资\n“);
for(n=0;fread(&emp,sizeof(struct employee),1,fp);n++)
if(emp[n].salar>=num)
printf(“%6d%6s%9s%8s%8d%8d\n“,n+1,emp[n].no,emp[n].name,emp[n].sex,
emp[n].year,emp[n].salar);
fclose(fp);
参考技术B #include<iostream.h>
class location //基类
public:
location(float b ,float c ) //带参数的构造函数
x=b;y=c;
~location() //析构函数
float area()
return 0;
float get_x()return x;
float get_y()return y;
private:
float x,y; //私有成员
;
class circle: virtual public location //虚 共有继承 使基类 location中的成员函数 对 circle的同名成员函数无歧义、覆盖作用
public:
circle(float a,float b,float c):location(b,c),radius(a) //注意 radius(a)的写法今后可要多多学习哦
~circle()
float area() //一个求圆的面积的函数,其返回值为 float 型
s1=3.14*radius*radius;
return s1;
void put(circle A) //样板输出
cout<<"圆的位置:"<<A.get_x()<<","<<A.get_y()<<endl;
private:
float radius,s1;
;
class Rectangle:virtual public location //同第二个 circle类一样
public:
Rectangle(float a,float b ,float c,float d):location(c,d),high(a),wide(b)
~Rectangle()
float area()
s2=high*wide;
return s2;
void put(Rectangle B)//带参数的构造函数,且参数为 Rectangle类中的对象B
cout<<"矩形的位置:"<<B.get_x()<<","<<B.get_y()<<endl;
private:
float high ,wide,s2;
;
class cylinder:public circle ,public Rectangle
public:
cylinder(float a,float b,float c,float d):location(c,d),circle(a,c,d),Rectangle(2*3.14*a,b,c,d)
~cylinder()
float area(cylinder C)
s3=2*C.circle::area()+C.Rectangle::area();
return s3;
void put(cylinder D)
cout<<"圆柱的位置:"<<D.get_x()<<","<<D.get_y()<<endl;
private:
float s3;
;
void main()
circle m(1,3,4); //带有默认值的 circle类中的一个对象
cout<<"圆的面积:"<<m.area()<<endl;
m.put(m);
Rectangle n(1,2,3,4); //同上
cout<<"矩形的面积:"<<n.area()<<endl;
n.put(n);
cylinder o(1,5,3,4);
cout<<"圆柱的面积:"<<o.area(o)<<endl;
o.put(o);
o.circle::put(o);//调用 circle类里的put()函数,注意 circle::不能省去
o.circle::area();
o.Rectangle::area();
o.put(o);//调用本类中的成员函数
至于cylinder类就是继承了两个类的共有部分,相信应该难不倒你!
以上是关于帮忙解释这段c++语言的主要内容,如果未能解决你的问题,请参考以下文章