实验六:类的继承机制与派生类的定义(一)

一、实验目的:

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 来指定的。

在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值