当前位置: 首页 > news >正文

C++面向对象入门:实验六

View Post

C++面向对象入门:实验六

一、实验目的

  1. 掌握基类与派生类的定义与使用方法。

  2. 学习虚函数和纯虚函数的声明与使用。

  3. 掌握抽象类的定义与使用。

  4. 熟悉运算符重载的基本方法。

二、实验内容

  1. 输入并编译程序,运行出结果,并解释每行语句作用。
#include<iostream>
using namespace std;
class A{
public:			//定义类A,访问权限设为publicA(int a=10)	//类A的构造函数,参数a=10:_a(a)	//将参数a赋给成员变量_a{ }virtual void Get(){//声明并定义虚函数cout<<"A::_a="<<_a<<endl;//输出_a}
public:		//访问权限为publicint _a;	//定义公有成员变量_a
};
class B : public A{	//定义类B,公有继承A
public:				//访问权限为publicB(int b=20)		//类B的构造函数,参数b=20:_b(b)		//初始化_b{ }void Get(){		//覆盖基类虚函数cout<<"B::_b="<<_b<<endl;//输出_b}int _b;//定义B的成员变量_b
};
int main(){A a1;	//创建A类对象a1,使用默认构造函数B b1;	//创建B类对象b1A* ptr1=&a1;//声明基类指针ptr1,指向a1对象ptr1->Get();//调用虚函数,ptr1指向A类对象ptr1=&b1;	//将ptr1的指向改为派生类对象b1ptr1->Get();//调用虚函数,ptr1指向B类对象return 0;
}

运行结果

A::_a=10
B::_b=20
  1. 输入并编译程序,运行出结果,并解释每行语句作用。
#include<iostream>
using namespace std;
const double PI=3.14159;//定义圆周率常量
class Graph{			//定义抽象基类Graph
public:virtual double area()=0;//声明纯虚函数area(),使Graph成为抽象类
};
class round:public Graph{//定义圆形类,继承Graph
public:double radius;	//圆的半径round(double r){radius=r;}	//构造函数double area(){	//重写area()函数,计算圆面积return PI*radius*radius;}bool round::operator==(const round &n)const{//重载==运算符return(radius==n.radius);}//比较两个圆半径是否相等
};
class column:public round{//定义圆柱体类,继承圆形类
public:column(double r,double h):round(r){height=h;}	//构造函数double area(){	//重写area(),计算圆柱体表面积return 2.0*PI*radius*(height+radius);}
private:double height;	//圆柱体的高度
};
int main(){Graph *p;	//声明基类Graph的指针pround sobj1(2),sobj2(3);//创建圆对象p=&sobj1;	//p指向第一个圆对象cout<<"半径为2的圆的面积为:"<<p->area()<<endl;//调用面积计算column cobj(3,4);//创建圆柱体对象p=&cobj;	//p指向圆柱体对象cout<<"半径为3,高为4的圆柱体的面积为:"<<p->area()<<endl;//调用面积计算if(sobj1==sobj2)//使用重载==运算符比较两个圆的半径cout<<"两个圆的半径相等"<<endl;else cout<<"两个圆的半径不相等"<<endl;system("pause");//暂停程序
}

运行结果

半径为2的圆的面积为:12.5664
半径为3,高为4的圆柱体的面积为:131.947
两个圆的半径不相等
  1. 某学校对教师每月工资的计算规定如下: 固定工资+课时补贴。教授的固定工资为5000元,每个课时补贴50元。副教授的固定工资为3000元,每个课时补贴30元。讲师的固定工资为2000元,每个课时补贴20元。定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资(此处假设某教授达到10课时,某副教授达到20课时,某讲师达到30课时)
#include<iostream>
using namespace std;
class teacher{
protected:int hours;
public:teacher(int h):hours(h){}virtual int Salary()=0;virtual ~teacher(){}
};
class professor1:public teacher{
public:professor1(int h):teacher(h){}int Salary() override{return 5000+50*hours;}
};
class professor2:public teacher{
public:professor2(int h):teacher(h){}int Salary() override{return 3000+30*hours;}
};
class lecturer:public teacher{
public:lecturer(int h):teacher(h){}int Salary() override{return 2000+20*hours;}
};
int main(){teacher* teachers[3];teachers[0]=new professor1(10);teachers[1]=new professor2(20);teachers[2]=new lecturer(30);for(int i=0;i<3;i++){int salary=teachers[i]->Salary();cout<<i+1<<"教师的月工资: "<<salary<<endl;}for(int i=0;i<3;i++){delete teachers[i];}return 0;
}

三、实验总结

本次实验进一步巩固了面向对象编程中的继承、多态、抽象类和运算符重载等核心概念。也练习了纯虚函数的使用以及运算符重载的方法,掌握了如何为自定义类型定义运算符。这次实验不仅加深了我对C++面向对象机制的理解,也提升了实际问题分析和程序设计的能力。