内蒙古科技大学面向对象的程序设计实验报告一、实验目的1.理解继承的含义以及声明;2.理解共有派生、私有派生和保护派生的含义以及使用;3.理解单派生类中构造函数和析构函数的调用顺序。
二、实验环境编译器:Visual C++ 6.0.操作系统:Windows 7 旗舰版三、实验内容2.1练习(一):1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include "iostream.h"class CBase{public:CBase(int a):a(a){}protected:void print(){cout<<"a="<<a<<endl;}private:int a;};class CDerive : public CBase{public:void print(){CBase::print();cout<<"b="<<b<<endl;}private:int b;};void main(){CDerive d;d.print();CBase b;b.print();}问题一:以上程序有两大错误,试指出来,并改正之?2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include "iostream.h"class CBase{public:CBase(int a):a(a){cout<<"base structure"<<endl;}~CBase(){cout<<"base destructure"<<endl;}void print(){cout<<"a="<<a<<endl;}protected:int a;};class CDerive : public CBase{public:CDerive(int a, int b,int c):CBase(a),b(b),c(c){cout<<"derive structure"<<endl;}~CDerive(){cout<<"derive destructure"<<endl;}void print(){CBase::print();cout<<"b.a="<<b.a<<endl;cout<<"c="<<c<<endl;}private:CBase b;int c;};void main(){CDerive d(1,2,3); -----------------------------------------------------①d.print();}问题一:以上程序的输出结果是什么,说明为什么?问题二:①处语句执行完后,d.b.a的值为多少?2.2练习(二):1.定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点:a.CLine类含有计算直线长度和斜率的成员函数;b.CCircle类含有计算圆面积的成员函数。
四、实验过程练习1实验题目源代码如下:直接编译结果如下:查看错因,首先前两句话写明,在创建CBase和CDerive对象时候,没有传递参数,实际代码中CDerive根本没有正确的构造函数,代码区中加入一段带有初始化列表的构造函数第三句话指明基类对象b直接调用CBase类保护成员函数,属于类外调用,权限错误,此处可以将print的权限改为public修改后的代码如下:然后尝试编译运行:运行成功,符合题意练习2实验题目提供源代码如下:尝试编译:错误集中在基类成员数据a上,分析代码,CDerive类对象d 创建时候一共有三个参数,1传递至派生类,再调用基类构造函数,3直接传递给派生类构造函数, 2传递给了派生类的中内嵌的基类成员对象,然而在公有继承下,派生类对象只能访问基类的公有数据,所以此处将a的权限改为public,修改之后的代码如下:尝试编译运行:结果和代码本意相同,修改成功练习3根据题意,设计代码如下:面积计算以及斜率计算分别写在了CLine类和CCircle类的构造函数中,在创建对象的时候输入x2,y2 r即可算出距离和面积试运行结果如下:运行结果正确五、实验总结实验源代码:练习(一)#include "iostream.h"class CBase{public:CBase(int a):a(a){}// protected:void print() //错误1.CBase类对象类外无法直接调用此主函数,应该改为public型{cout<<"a="<<a<<endl;}private:int a;};class CDerive : public CBase{public:CDerive(int a,int b):CBase(a),b(b) //错误2.构造函数错误,初始化列表和参数错误{}void print(){CBase::print(); //保护继承下,派生类中可以访问基类的公有和保护数据cout<<"b="<<b<<endl;}private:int b;};void main(){CDerive d(0,0); //因为原题构造函数中有形参,所以创建要加上参数d.print();CBase b(0);b.print();}/*#include "iostream.h"class CBase{public:CBase(int a):a(a){}protected:void print(){cout<<"a="<<a<<endl;}private:int a;class CDerive : public CBase {public:void print(){CBase::print();cout<<"b="<<b<<endl;}private:int b;};void main(){CDerive d;d.print();CBase b;b.print();}*/练习(二)#include "iostream.h"class CBase{public:CBase(int a):a(a){cout<<"base structure"<<endl; }~CBase(){cout<<"base destructure"<<endl; }void print(){cout<<"a="<<a<<endl;}public:int a;class CDerive : public CBase{public:CDerive(int a, int b,int c):CBase(a),b(b),c(c){cout<<"derive structure"<<endl;}~CDerive(){cout<<"derive destructure"<<endl;}void print(){CBase::print();cout<<"b.a="<<b.a<<endl; //公有继承下派生类子对象只能访问基类的公有数据;cout<<"c="<<c<<endl;}private:CBase b;int c;};void main(){CDerive d(1,2,3);// -----------------------------------------------------①d.print();}/*1.没有任何输出结果,因为程序无法通过编译2.d.b.a的值为2 ,因为构造函数实参的第二个元素2,传递给CDerive类的子对象b,b.a被初始化为2 *//*#include "iostream.h"class CBase{public:CBase(int a):a(a)cout<<"base structure"<<endl;}~CBase(){cout<<"base destructure"<<endl;}void print(){cout<<"a="<<a<<endl;}protected:int a;};class CDerive : public CBase{public:CDerive(int a, int b,int c):CBase(a),b(b),c(c){cout<<"derive structure"<<endl;}~CDerive(){cout<<"derive destructure"<<endl;}void print(){CBase::print();cout<<"b.a="<<b.a<<endl;cout<<"c="<<c<<endl;}private:CBase b;int c;};void main(){CDerive d(1,2,3); -----------------------------------------------------①d.print();}*/练习(三)#include <iostream.h>#include <math.h>class CPoint{private:float x,y;public:CPoint(float x1,float y1):x(x1),y(y1){cout<<"--------CPoint基类构造函数已调用---------"<<endl; }void display(){cout<<"x= "<<CPoint::x<<" "<<"y= "<<CPoint::y<<endl; }};class CLine:public CPoint{private:double k;double l;public:CLine(float x1,float y1):CPoint(x1,y1){cout<<"--------CLine派生类构造函数已调用--------"<<endl; float x2,y2;cout<<"Please input x2,y2:"<<endl;cin>>x2>>y2;l=sqrt((x1-x2)*(x1-x2)+(y2-y1)*(y2-y1));cout<<"l:"<<l<<endl;if(y2-y1!=0){k=(y2-y1)/(x2-x1);cout<<"k= "<<k<<endl;}elsecout<<"分母为0,k不存在"<<endl;}};class CCircle:public CPoint{private:double r;public:CCircle(float x1,float y1):CPoint(x1,y1){cout<<"--------CCircle派生类构造函数已调用------"<<endl; cout<<"please input r:"<<endl;cin>>r;cout<<"S= "<<3.14159*r*r<<endl;}};void main(){float x1,y1;cout<<"Please input x1,y1:"<<endl;cin>>x1>>y1;CPoint CP(x1,y1);CP.display();CLine CL(x1,y1);CCircle CC(x1,y1);}六、参考文献参考的资料:C++面向对象程序设计。