一、实验目的:
1、理解类的继承的概念,能够定义和使用类的继承关系。
2、掌握派生类的声明与定义方法。
3、熟悉公有派生、私有派生和保护派生的访问特性,理解保护成员在继承中的作用。
4.、掌握派生类构造函数的定义及在定义、释放派生类对象时构造函数、析构函数的执
二、实验环境:
1、 PC计算机一台;
2、 Dev-C++开发环境。
三、实验原理:
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
四、实验内容:
1、编写一个person类,包含身份证号,姓名,输入和显示等成员。由person类作为基类派生出student类和teacher类,学生类包含学号,姓名,班级和成绩;老师类包含编号,姓名,职称和部门。
2、在图形基类(包含求周长、面积的函数、图形个数)的基础上派生出圆形类、矩形类和三角形类,分别增加新的成员,编写主函数,计算并输出:定义图形的个数,不同图形对象的周长和面积。
3、
写出下列程序的运行结果:
五、实验代码及结果(程序运行结果以截屏图给出):
编写一个person类,包含身份证号,姓名,输入和显示等成员。由person类作为基类派生出student类和teacher类,学生类包含学号,姓名,班级和成绩;老师类包含编号,姓名,职称和部门。
#include<iostream>
using namespace std;
class Person{
private:
string idnumber;
string name;
public:
Person(string id,string na):idnumber(id),name(na){}
void showPerson(){
cout<<"Person:"<<endl;
cout<<"idnumber:"<<idnumber<<";name:"<<name<<endl;
}
};
class Student:public Person{
private:
string studentNum;
string studentClass;
double studentScore;
public:
Student(string num,string name,string sn,string sc,double ss):
Person(num,name),studentNum(sn),studentClass(sc),studentScore(ss){}
void showStudent(){
showPerson();
cout<<"Student:"<<endl;
cout<<"number:"<<studentNum<<";studentClass:"<<studentClass<<";studentScore:"<<studentScore<<endl<<endl;
}
};
class Teacher:public Person{
private:
string teacherNum;
string teacherPosition;
string teacherDepartment;
public:
Teacher(string num,string name,string tn,string tp,string td):
Person(num,name),teacherNum(tn),teacherPosition(tp),teacherDepartment(td){}
void showTeacher(){
showPerson();
cout<<"Teacher:"<<endl;
cout<<"num:"<<teacherNum<<";teacherPosition:"<<teacherPosition<<";teacherDepartment:"<<teacherDepartment<<endl<<endl;
}
};
int main()
{
Student stu("2021001","Tom","2000483928","18级电子1班",100);
stu.showStudent();
Teacher teacher("2021009","Juery","1990238540","学生部","教授");
teacher.showTeacher();
system("pause");
return 0;
}
在图形基类(包含求周长、面积的函数、图形个数)的基础上派生出圆形类、矩形类和三角形类,分别增加新的成员,编写主函数,计算并输出:定义图形的个数,不同图形对象的周长和面积。
#include<iostream>
#include<math.h>
using namespace std;
const double PI=3.1415926;
static int num=0;
bool Validate(double a, double b, double c){
//判断三角形是否合法
if((a>0) && (b>0) && (c>0)){
if((a+b)<=c) return 0;
if((a+c)<=b) return 0;
if((c+b)<=a) return 0;
return 1;
}else{
return 0;
}
}
class Shape{
public:
double perimeter=0;
double area=0;
private:
string name;
public:
Shape(string na):name(na){}
void showShape(){
cout<<"Shape:"<<num<<"\t"<<name<<endl;
}
};
class Circle:public Shape{
private:
double rad;
public:
Circle(string na,double r):Shape(na),rad(r){
num++;
}
void showCircle(){
showShape();
perimeter=2*PI*rad;
area=PI*rad*rad;
cout<<"周长:"<<perimeter<<"\t面积:"<<area<<endl<<endl;
}
};
class Rectangle:public Shape{
private:
double length, width;
public:
Rectangle(string na,double l,double w):Shape(na),length(l),width(w){
num++;
}
void showRectangle(){
showShape();
perimeter=2*(length+width);
area=length*width;
cout<<"周长:"<<perimeter<<"\t面积:"<<area<<endl<<endl;
}
};
class Triangle:public Shape{
private:
double aa,bb,cc;
public:
Triangle(string na,double a,double b,double c):Shape(na),aa(a),bb(b),cc(c){
num++;
}
void showTriangle(){
showShape();
if(Validate(aa,bb,cc)){
perimeter=aa+bb+cc;
double s = (aa+bb+cc)/2.0;
area = sqrt(s*(s-aa)*(s-bb)*(s-cc));
cout<<"周长:"<<perimeter<<"\t面积:"<<area<<endl<<endl;
}else{
cout<<"错误:不能构成三角形!"<<endl;
}
}
};
int main(){
Circle c1("一个圆",1);
c1.showCircle();
Rectangle re("一个矩形",2,4);
re.showRectangle();
Triangle tr("一个三角形",3,6,4);
tr.showTriangle();
system("pause");
return 0;
}
查看程序的运行结果:
#include<iostream>
using namespace std;
class B0{
private:
float x,y;
public:
B0(float a=0,float b=0){
x=a;
y=b;
cout<<"基类构造函数被调用!"<<endl;
}
~B0(){
cout<<"基类构造函数被调用!"<<endl;
}
void print(){
cout<<"x="<<x<<" y="<<y<<endl;
}
};
class D1:public B0{
private:
float z;
public:
D1(float a=0,float b=0,float c=0):B0(a,b){
z=c;
cout<<"派生类构造函数被调用!"<<endl;
}
~D1(){
cout<<"派生类构造函数被调用!"<<endl;
}
void print(){
cout<<"z="<<z<<endl;
}
};
int main()
{
B0 a(10.0,20.0);
D1 b(10.0,20.0,30.0);
a.print();
cout<<endl;
b.print();
cout<<endl;
system("pause");
return 0;
}
六、实验小结:
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。
在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。