面向对象程序设计实验报告
姓名:
学号:
班级:
专业:
学院:
实验三 函数的应用
一、实验目的:
掌握函数的定义 和调用方法;练习重载函数使用;练习函数模板的使用;练习使用系统函数。
二、实验步骤
编写函数float Convert(float TempFer),参数的返回值都为float类型,实现算法C=(F-32)*5/9,在main()函数中实现输入、输出。
分别编写四个同名函数max1,实现函数重载,在main()函数中测试函数功能。
使用函数模板实现求任意类型数的最大值,针对不同的参数个数,编写两个同名函数模板max1,其参数个数不同,实现函数重载,在main()函数中测试函数的功能。
在main()函数中提示输入两个整数x,y,使用cin语句得到x,y的值,调用pow(x,y)函数计算x的y次幂的结果,再显示出来。
编写递归函数int fib(int n),在主程序中输入n的值,调用fib函数计算Fibonacci级数。公式为fib(n)=fib(n-1)+fib(n-2),n>2;fib(1)=fib(2)=1。使用if语句判断函数的出口,在程序中用cout语句输出提示信息。
三、实验内容及部分代码:
1)编写一个函数把华氏温度转换为摄氏温度,转换公式为:C=(F-32)*5/9。
#include<iostream.h>
float Convert(float TempFer)
{
float C,F;
F=TempFer;
C=(F-32)*5/9;
return C;
}
main()
{float C,F;
cin>>F>>endl;
c=Convert(f);
cout<<”摄氏温度:”<<endl;
}
2)编写重载函数Max1可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。
#include<iostream.h>
int maxl(int a,int b);
int maxl(int a,int b,int c);
int maxl(float a,float b);
int maxl(float a,float b,float c);
int main()
{int A,B,C;float Max;
float D,E,F;
Max=maxl(A,B);
Max=maxl(A,B,C);
Max=maxl(D,E);
Max=maxl(D,E,F);
return 0;
}
int maxl(int a,int b)
{int max;
if(a>b)
max=a;
else max=b;
return max;
}
int maxl(int a,int b,int c)
{
int max;
max=(a>b?a:b)>c?(a>b?a:b);
return max;
}
float maxl(float a,float b)
{
float max;
if(a>b)
max=a;
else max=b;
return max;
}
float maxl(float a,float b,float c)
{
float max;
max=(a>b?a:b)>c?(a>b?a:b):c;
return max;
}
3)使用重函数模板重新实现上小题中的函数Max1。
#include<iostream.h>
template<typename T>
T maxl(T a,T b);
{
return a>b?a:b;
}
int main()
{
int A,B;
float C,D;
cout<<maxl(A,B)<<endl;
cout<<maxl(C,D)<<endl;
return 0;
}
3)使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。
#include<iostream.h>
#include<math.h>
main()
{ int x,y;
cin>>x>>y;
cout<<x<<"的"<<y<<"次方为:"<<pow(x,y)<<endl;
}
4)用递归的方法编写函数求Fibonacci级数。
#include <iostream.h>
int fib(int n);
int main()
{ int n,answer;
cout<<”Enter number:”;
cin>>n;
cout <<”\n\n”;
answer=fib(n);
cout<<answer<<”is the “<<n<<”th Fibonnaci number\n”;
return 0;
}
int fib(int n)
{
if(n<3) return 1;
else return fib(n-2)+fib(n-1);
}
4、实验思考及体会:在本次实验中,;了解到各种函数的运用和性质,以及函数模板的调用,重载函数,函数模板,系统函数的使用。
实验四 类与对象
一、 实验目的:
掌握类的定义和使用
掌握类的定义和对象的声明
复习具有不同访问属性的成员的访问方式。
察构造函数和析构函数的执行过程。
学习类的聚集使用方法。
二、实验步骤:首先定义枚举类型CPU_Rank,例如 enum CPU_Rank{ P1=1,P2,P3,P4,P5,P6,P7},再定义CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等私有数据成员,定义成员函数run、stop,用来输出提示信息,在构造函数和析构函数中也可以输出提示信息。在主程序中定义一个CPU类的对象,调用其成员函数,观察类对象的构造与析构顺序,以及成员函数的调用。
三、实验内容及部分代码:
1)定义一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。其中rank为枚举类型CPU_Rank,定义一个enum CPU_Rank={P1=1,P2,P3,P4,P5,P6,P7},frequency为单位为MHz的整型数,voltage为浮点型的电压值。
#include <iostream.h>
class CPU {
CPU_Rank rank;
int frequency;
float voltage;
public:
enum CPU_Rank{p1=1, p2, p3, p4, p5, p6, p7};
CPU() {
std::cout << "CPU constructive" << std::endl;
}
void run() {};
void stop() {};
virtual ~CPU(){
std::cout << "CPU destructive" << std::endl;
}
};
class RAM {
public:
RAM(){
std::cout << "RAM constructive" << std::endl;
}
~RAM(){
std::cout << "RAM destructive" << std::endl;
}
};
class CDROM {
public:
CDROM(){
std::cout << "CDROM constructive" << std::endl;
}
~CDROM(){
std::cout << "CDROM destructive" << std::endl;
}
};
class Computer {
private:
CPU cpu;
RAM ram;
CDROM cdrom;
public:
Computer(){
std::cout << "Computer constructive" << std::endl;
}
void run() {};
void stop() {};
~Computer() {
std::cout << "Computer destructive" << std::endl;
}
};
int main (int argc, char *argv[]) {
CPU *cpu = new CPU();
Computer *computer = new Computer();
delete cpu;
delete computer;
return 0;
}
2)定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。
#include<iostream.h>
enum CPU_Rank{P1=1,P2,P3,P4,P5,P6,P7};
class CPU
{ private:
CPU_Rank rank;
int frequency;
float voltage;
public:
CPU(CPU_Rank r,int f,float v)
{
rank=r;
frequency=f;
voltage=v;
cout<<"构造了一个CPU!"<<endl;
}
~CPU(){cout<<"析构了一个CPU!"<<endl;}
CPU_Rank GetRank()const{return rank;}
int GetFrequency()const{return frequency;}
float GetVoltage()const{return voltage;}
void SetRank(CPU_Rank r){rank=r;}
void SetFrequency(int f){frequency=f;}
void SetVoltage(float v){voltage=v;}
void Run(){cout<<"CPU开始运行!"<<endl;}
void Stop(){cout<<"CPU停止运行!"<<endl;}
};
class RAM //定义RAM类
{
int x;
public:
RAM(int a){x=a;
cout<<"构造了一个RAM!"<<endl;}
~RAM(){cout<<"析构了一个RAM!"<<endl;}
};
class CDROM //定义CDROM类
{
char y;
public:
CDROM(char v){y=v;cout<<"构造了一个CDROM!"<<endl;}
~CDROM(){cout<<"析构了一个CDROM!"<<endl;}
};
class Computer //定义Computer类
{
CPU a;
RAM b;
CDROM c;
public:
Computer(CPU_Rank x,int y,float z,int xx,char yy)//构造函数
:a(x,y,z),b(xx),c(yy)
{
cout<<"构造了一个Computer!"<<endl;}
~Computer(){cout<<"析构了一个Computer!"<<endl;}
void Run(){cout<<"Computer开始运行!"<<endl;}
void Stop(){cout<<"Computer停止运行!"<<endl;}
};
void main()
{
Computer niu(P6,3,2.9,4,'G');
niu.Run();
niu.Stop();
}
3)设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数。
#include <iostream>
#include <string>
class Date //日期类
{
private:
int year;
int month;
int day;
public:
Date(){} //默认构造
Date(int y,int m,int d) //带参构造
{
year=y;
month=m;
day=d;
}
void set() //设置数据函数
{
cin>>year>>month>>day;
}
void display() //显示函数
{
cout<<year<<'/'<<month<<'/'<<day;
}};
class Person //人员类
{
private:
int num;
char sex;
Date birthday;
char ID[19];
public:
Person(){} //默认构造
Person(int n,int y,int m,int d,char id[19],char s='m'):birthday(y,m,d)
{
num=n;
sex=s;
strcpy(ID,id);
} //有默认值的带参构造
Person(Person& p) //拷贝构造
{
num=p.num;
sex=p.sex;
birthday=p.birthday;
strcpy(ID,p.ID);
}
void input() //输入函数
{
cout<<"录入数据:"<<endl;
cout<<"编号:";
cin>>num;
cout<<"性别(m/f):";
cin>>sex;
cout<<"生日:";
birthday.set();
cout<<"身份证号:";
cin>>ID;
ID[18]='\0';
cout<<endl;
}
void output() //输出函数
{
cout<<"编号:"<<num<<endl;
cout<<"性别:"<<sex<<endl;
cout<<"生日:";
birthday.display();
cout<<endl;
cout<<"身份证号:"<<ID<<endl;
}
~Person() //析构函数
{
cout<<num<<"号人员信息已删除。"<<endl;
}
};
int main()
{
Person p1;
p1.input();
p1.output();
return 0;
}
4、实验思考及体会:通过本次试验更加了解了C++中类与对象的含义,类和函数的互相使用,以及类的编写和使用。
实验五 C++程序的结构
一、实验目的
观察程序运行中变量的作用域、生存期和可见性。
学习类的静态成员的使用。
学习多文件结构在C++程序中的使用。
二、实验步骤
1. 运行程序lab5_1,观察程序输出。
全局变量的作用域为文件作用域,在整个程序运行期间有效,但如果在局部模块中定义了同名的变量,则在局部模块中,可见的是局部变量,此时,全局变量不可见;而局部变量的生存期只限于相应的程序模块中,离开相应的程序模块,局部变量x、y就不再存在,此时同名的全局变量重新可见。
2. 新建一个空的项目lab5_2,添加头文件client.h,在其中定义类CLIENT,注意使用编译预处理命令;再添加原程序文件client.cpp,在其中实现CLIENT类,注意静态成员变量的使用方法,再添加文件lab5_2.cpp,在其中定义main()函数,测试CLIENT类,观察相应的成员变量取值的变化情况。
3、实验内容及部分代码:
1)运行下面的程序,观察变量x、y的值。
#include<iostream.h>
void fnl();
int x=1,y=2;
int main()
{
cout<<"Begin..."<<endl;
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"Evaluate x and y in main()..."<<endl;
int x=10, y=20;
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"Step into fnl()..."<<endl;
fnl();
cout<<"Back in main"<<endl;
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
return 0;
}
void fnl()
{
int y=20;
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
经运行,实验运行结果:Begin...
x=1
y=2
Evaluate x and y in main()...
x=10
y=20
Step into fnl()...
x=1
y=20
Back in main
x=10
y=20;
2)现客户机(CLIENT)类。定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeSeverName()改变服务器名称。在头文件client.h中定义类,在文件client.cpp中实现,在test.cpp中测试这个类,观察相应的成员变量取值的变化情况。
client.h文件:
class CLIENT
{
private:
static char[10] ServerName; //保存其服务器名称
static int ClientNum; //记录已定义的客户数量
public:
ChangeServerName(); //改变服务器名称
};
4、实验思考及体会:通过本次实验,了解域的性质和使用情况,对字符串,数据组的使用,静态动态数据组的使用。
实验六 数组、指针与字符串
1、实验目的:
学习使用数组。
学习字符串数据的组织和处理。
学习标准C++库的使用。
掌握指针的使用方法。
练习通过debug观察指针的内容及其所指的对象的内容。
练习通过动态内存分配实现动态数组,并体会指针在其中的作用。
分别使用字符数组和标准C++库练习处理字符串的方法。
2、实验步骤:
1、编写矩阵转置函数,输入参数为3*3整型数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输输出。。
2、改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中 new 操作符分配内存生成动态数组。
3、编程实现两字符串的连接。定义字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用count 语句显示输出。用 cin 实现输入,注意,字符串的结束标志是ASCII码 0,使用循环语句进行字符串间的字符拷贝。
使用string类定义字符串对象,编程实现两字符串的连接。在string类中已重载了运算符“+ =”实现字符串的连接,可以使用这个功能。
4、在employee.h文件中定义Employee类, EmpLoyee类具有姓名、街道地址、城市和邮遍等私有数据成员,都可以用字符型数组来表示,在成员函数中,构造函数用来初始化所有成员数组,对字符数组的赋值可以使用字符串拷贝函数 strcpy(char *,char * name);display()中使用count显示姓名、街道地址、城市和邮遍等属性,chang_name()改变类中表示姓名属性的字符数组类型的数据成员。在主程序中定义这个类的对象并对其进行操作。
5、使用上一小题中定义的Employee类定义对象数组enp[5],使用循环语句把数据显示出来。
三、实验内容及部分代码:
1)编写并测试3*3 矩阵转置函数,使用数组保存 3*3 矩阵。
#include<iostream.h>
void main()
{
int a[3][3],i,j,b[3][3];
cout<<"请依次输入距阵中的元素:"<<endl;
for( i=0;i<3;i++)
{
for( j=0;j<3;j++)
{
cin>>a[i][j];
}
}
cout<<"此矩阵中的元素为:"<<endl;
for( i=0;i<3;i++)
{
for( j=0;j<3;j++)
{
cout<<a[i][j];
cout<<" ";
}
cout<<endl;
}
cout<<"经过转置后矩阵为:"<<endl;
for( i=0;i<3;i++)
{
for( j=0;j<3;j++)
{
b[i][j]=a[j][i];
cout<<b[i][j];
cout<<" ";
}
cout<<endl;
}
}
使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能
#include<iostream.h>
#include<stdlib.h>
void print(int *a)
{
for(int i=0;i<9;i++)
{
cout<<*a;
cout<<" ";
a++;
if((i+1)%3==0)cout<<endl;
}
}
void reserve(int *&a)
{
int b[3][3],i,j;
int *c;
c=a;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
b[i][j]=*a;
a++;
}
}
a=c;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
*a=b[j][i];
a++;
}
}
a=c;
}
void main()
{
int i,j;
int *a,*b;
a=(int *)new int[3][3];
b=a;
cout<<"请依次输入距阵中的元素:"<<endl;
for(i=0;i<9;i++)
{
cin>>*a;
a++;
}
a=b;
cout<<"此距阵中的元素为:"<<endl;
print(a);
reserve(a);
cout<<"经过转置后此距阵为:"<<endl;
print(a);
}
2)编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。
使用sting类定义字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。
#include <iostream>
using namespace std;
int main()
{
char str1[40];
char str2[20];//保证被连接字符串长度大于待连接字符串的长度.
int counter1=0,counter2=0;//计数器
cout<<"请输入第一个字符串: ";
cin>>str1;
cout<<"\n请输入第二个字符串: ";
cin>>str2;
while(str1[counter1]!='\0') //这个循环用于找到第一个字符串的最后一字符位置
++counter1; //counter1用于记录这个位置
while(str2[counter2]!='\0')
{
str1[counter1-1]=str2[counter2]; //从第一个字符串的末尾开始复制
++counter1;
++counter2;
}
str1[counter1]='\0'; //将字符串的结束位改成 连接后的字符串的末尾
cout<<"\n连接后的字符串: "<<str1;
}
3)定义一个Employee类,其中包括姓名、街道地址、城市和邮遍等属性。以及 change_name() 和display()等函数。display()显示姓名、街道地址、城市和邮遍等属性,change_name()改变对象的姓名。
#include <iostream>
using namespace std;
class Employee {
private:
char *name,*address,*city,*postCode;
public:
Employee(char *_name,char *_address,char *_city,char *_postCode)
{
name = _name;
address = _address;
city = _city;
postCode = _postCode;
}
void change_name(char *_name){
name = _name;
}
void display()
{
cout << "name : " << name << endl;
cout << "address : " << address << endl;
cout << "city : " << city << endl;
cout << "postcode : " << postCode << endl;
}
};
int main(int argc,char *argv[])
{
Employee *e = new Employee("zhangsan","chang d d","beijing","100056");
e->display();
e->change_name("lisi");
e->display();
delete e;
}
4、实验思考及体会:通过本次实验,了解了指针变量可以指向任何类型的对象,它指向数组、结构、函数、数组的数组元素等。同时对多维数组也有了深刻的认识。
实验七、继承与派生(一、二)
1、实验目的:
学习定义和使用类的继承关系,定义派生类。
熟悉不同继承方式下对基类成员的访问控制。
学习利用虚基类解决二义性问题。
二、实验步骤
编写程序定义基类Animal,成员变量age定义为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:
error C2248:’age’:cannot access private member declared in class ‘Animal’
error C2248:’age’:cannot access private member declared in class ‘Animal’
把age改为公有成员变量后重新编译就可以了。(2) 编写程序定义一个基类BassClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名为:lab7_2.cpp。
(3) 用debug功能跟踪程序lab7_2的执行过程,观察基类和派生类的构造函数和析构函数的执行情况。
写程序定义一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车类(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名为:lab7_3.cpp。
编译成功后,把vehicle设置为非虚基类,再编译一次,此时系统报错,无法编译成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。
3、实验内容及部分代码:
1)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?
# include <iostream>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "Aninmal is constructed!"<<endl;
}
~Animal()
{
cout << "Aninmal is deconstructed!"<<endl;
};
void SetAge(int n)
{
age=n;
}
int GetAge()
{
return age;
}
private :
int age;
char name;
};
class Dog:public Animal
{
public:
Dog()
{
cout << "Dog is constructed!"<<endl;
}
~Dog()
{
cout << "Dog is constructed!"<<endl;
}
};
int main()
{
Dog dog;
dog.SetAge(12);
cout <<"age=" <<dog.GetAge() <<endl;
return 0;
}
运行结果:Aninmal is constructed!
Dog is constructed!
age=12
Dog is constructed!
Aninmal is deconstructed!
2)定义一个基类BaseClass,有整型成员变量Number ,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
#include<iostream>
using namespace std;
class baseclass{
public:
int number;
baseclass(){}
baseclass(int);
};
class derivedclass:public baseclass{
public:
int number_derived;
derivedclass(){}
derivedclass(int);
};
baseclass::baseclass(int num)
{
number = num;
cout<<number<<endl;
cout<<"call base class"<<endl;
}
derivedclass::derivedclass(int num)
{
number_derived = num;
cout<<number_derived<<endl;
cout<<"call derived class"<<endl;
}
int main()
{
baseclass Base(10);
derivedclass DBase(29);
return 1;
}
运行结果:10
call base class
29
call derived class;
3)定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车类有高度(height)等属性,汽车类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
#include<iostream>
using namespace std;
class Vehicle {
double MaxSpeed;
double Weight;
void Run(){};
void Stop(){}
}
class Bicycle extends Vehicle{
double Height;
void Run(){
System.out.println("I can 2!");
}
}
class Motocar extends Vehicle{
double SeatNum;
void Run(){
System.out.println("I can 3!");
}
}
class Motorcycle extends Vehicle{
void Run(){
System.out.println("I can 4!");
}
}
public class question2_7 {
public static void main(String[] args) {
Vehicle a=new Motorcycle();
Vehicle b=new Motocar();
a.Run();
b.Run();
}
}
Int main()
{
Vehicle (10)
}
4、实验思考及体会:通过本次实验了解了 :派生类是基类的具体化,而基类则是派生类的抽象。同时对正在进行多继时,出现的二义性问题有了了解。
实验八、多态性
1、实验目的:
掌握运算符重载的方法
习使用虚函数实现动态多态性。
2、实验步骤
1/编写程序定义Point类,在类中定义整型的私有成员变量x,y,定义成员函数Point& operator++();Point operator++(int);以实现对Point类重载“++”运算符,定义成函数Point& operator –();Point operator - -(int);以实现对Point类重载“- -”运算符,实现对坐标值的改变。
2、编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车类(motorcar),从bicycle类和motorcar类派生出摩托车类(motorcycle),它们都有Run、Stop等成员函数。在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。再分别用vehicle类型的指针来调用几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试看。
3、实验内容及部分代码:
1)定义Point类,有坐标x,y两个成员变量;对Point类重载“++”、“- -”运算符,实现对坐标值的改变。
#include <iostream.h>
class Point
{
private:
int x;
int y;
public:
Point (int a,int b){x=a;y=b;}
Point &operator ++(int);
Point &operator --(int);
Point &operator ++();
Point &operator --();
void print();
};
Point &Point::operator++(int)
{return Point(x++,y++);}
Point &Point::operator--(int)
{return Point(x--,y--);}
Point &Point::operator++()
{return Point(++x,++y);}
Point &Point::operator--()
{return Point(--x,--y);}
void Point::print()
{cout<<"x="<<x<<"\ty="<<y<<endl;}
main()
{ Point a1(2,3);
a1++;
a1.print();
}
2)定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。观察虚函的作用。
#include<iostream.h>
class vehicle // 定义汽车类
{
protected:
int wheels; // 车轮数
float weight; // 重量
public:
vehicle(int wheels,float weight);
int get_wheels();
float get_weight();
float wheel_load();
void show();
};
class car:public vehicle // 定义小车类
{
int passenger_load; // 载人数
public:
car(int wheels,float weight,int passengers=4);
int get_passengers();
void show();
};
class truck:public vehicle // 定义卡车类
{
int passenger_load; // 载人数
float payload; // 载重量
public:
truck(int wheels,float weight,int passengers=2,float max_load=24000.00);
int get_passengers();
float efficiency();
void show();
};
vehicle::vehicle(int wheels,float weight)
{
vehicle::wheels=wheels;
vehicle::weight=weight;
}
int vehicle::get_wheels()
{
return wheels;
}
float vehicle::get_weight()
{
return weight/wheels;
}
void vehicle::show()
{
cout << "车轮:" << wheels << "个" << endl;
cout << "重量:" << weight << "公斤" << endl;
}
car::car(int wheels, float weight,
int passengers) :vehicle (wheels, weight)
{
passenger_load=passengers;
}
int car::get_passengers ()
{
return passenger_load;
}
void car::show()
{
cout <<" 车型:小车" << endl;
vehicle::show();
cout << "载人:" << passenger_load << "人" << endl;
cout << endl;
}
truck:: truck(int wheels, float weight,int passengers, float max_load):vehicle(wheels,weight)
{
passenger_load=passengers;
payload=max_load;
}
int truck::get_passengers()
{
return passenger_load;
}
float truck::efficiency()
{
return payload/(payload+weight);
}
void truck::show()
{
cout <<"车型:卡车" << endl;
vehicle:: show ();
cout << "载人:" << passenger_load << "人" << endl;
cout << "效率:" << efficiency() << endl;
cout << endl;
}
void main ()
{
car car1(4,2000,5);
truck tru1(10,8000,3,340000);
cout << "输出结果" << endl;
car1. show ();
tru1. show ();
}
四、实验思考及体会:通过本次实验了解了:C++中的多态分为静多态和动多态,静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。
面向对象程序设计之课程设计上海电力学院课题名称院系专业学号姓名时间地点指导教师课程设计报告面向对象程序设计20xx20xx学年第一…
面向对象程序设计实验报告姓名学号班级专业学院实验三函数的应用一实验目的掌握函数的定义和调用方法练习重载函数使用练习函数模板的使用练…
题目11问题描述建立一个二维坐标系的类TwoCoor用xy表示坐标值实现两坐标点的加减运算计算两坐标点间的距离并重载输入输出运算符…
综合实验报告面向对象程序设计专业名称班级姓名学号信息科学与工程学院二零一三年七月信息科学与工程学院面向对象程序设计综合实验报告目录…
课程实验报告课程名称面向对象程序设计实验名称面向过程的整型栈编程院系计算机科学与技术专业班级学号姓名指导教师年日面向对象程序设计实…
安徽广播电视大学梁伍七一、引言中期评估之前,我校加强网络教学的同时,逐步形成了“面授辅导+网络教学+小组学习”的课程教学模式实践模…
课程实验报告课程名称面向对象程序设计实验名称面向过程的整型栈编程院系计算机科学与技术专业班级学号姓名指导教师年日面向对象程序设计实…
Java面向对象程序设计第1版Java面向对象程序设计课程实验一报告学号姓名专业学校1Java面向对象程序设计第1版11实验目标查…
C面向对象程序设计课程设计报告题目分数计算器设置班级专业计算机科学与技术学号K031241521姓名周林指导教师小组成员周林张齐满…
面向对象程序设计课程设计报告题目门禁系统的设计与实现系(院)计算机科学技术系专业软件技术班级20##级3班学生姓名学号指导教师二〇…
综合实验报告面向对象程序设计专业名称班级姓名学号信息科学与工程学院二零一三年七月信息科学与工程学院面向对象程序设计综合实验报告目录…