计算机程序设计c++ 11-1:派生类

问题

假设两个类,中间有些特征或者功能是有交叉的地方。现在想要合并两个类为一个新的类。简单的合并会面临的问题:代码大量重复!
因此需要通过采用继承式的抽象方法描述万物,不用重复的造轮子,减少代码重复

继承的概念

  • 从一个或多个以前定义的类(基类)产生新类的过程称为派生
  • 新产生的类又称为派生类
  • 类的继承(inheritance)是指新类从基类那里得到基类的特征,也就是继承基类的数据和函数
  • 派生的新类同时也可以增加或重新定义数据和函数

继承的好处

  • 软件复用是软件设计中常用的手段
  • 在程序设计中反复使用高质量的软件来缩短开发时间,提高效率(数量和质量)
  • 客观世界中许多实体之间是有继承特性的
    • 点→圆→圆柱体
    • 人→学生→大学生
    • 水果→桃→水蜜桃→陕西水蜜桃

派生类的定义

class 派生类名: 继承方式 基类名1, 继承方式 基类名2,, 继承方式 基类名n
{
    
    
	派生类增加的成员声明;
};
class sing_star:public person
{
    
    
	float salary; //薪水
	public:
		sing_star(); //无参构造函数
		sing_star(char *n,char s,char *p,int w,int h,float s1); //有参构造函数
		void change_data(char *n,char s,char *p,int w,int h,float s1);//修改数据
		void playing(char *ps); //演唱歌曲
		void print(); //输出歌星属性值
};

例子:人类中定义增加有关日期时间的属性
一个人一生中有许多重要日期和时刻

  • 上大学日期、结婚日期
  • 出生时间
class Date
{
    
    
	protected:
		int year
		int month;
		int day;
	public:
		Date() {
    
     year = 1900; month = day = 1; }
		Date(int yy,int mm,int dd){
    
     init(yy, mm, dd); };
		void init(int,int,int );
		void print_ymd();
		void print_mdy();
};

基类:时间类的定义

class Time
{
    
    
	protected:
		int hour;
		int miniter;
		int second;
	public:
		Time() {
    
     hour = miniter = second = 0; }
		Time(int h,int m,int s){
    
    init(h,m,s);};
		void init(int,int,int );
		void print_time();
};

派生类:人类的定义

class person:public Date, public Time
{
    
     
	//注意包含了基类person的出身日期和出身时间
	char name[20];
	char sex;
	char pid[19];
	int weight;
	int high;

	public:
		person();
		person(char *n,char s,char *p,int w,int h,int hr,int mr,int sd);
		void change_data(char *n,char s,char *p,int w,int h,int hr,int mr,int sd);
		void walking(int k);
		void hearing(char *sentence);
		void speek();
		void writing();
		void ShowMe();
};

派生类:人类的构造函数定义

person::person()
{
    
    
	name = new char[strlen("XXXXXX")+1];
	strcpy(name,"XXXXXX");
	strcpy(pid,"XXXXXXXXXXXXXXXXXX");
	sex='X';
	weight=0;
	high=0;
	year=1900;
	month=day=1;
	hour=miniter=second=0;
}


person::person(char *n, char s, char *p, int w, int hh, int hr, int mr, int sd)
{
    
    
	change_data(n, s, p, w, hh, hr, mr, sd);
}

修改数据函数定义

void person::change_data(char *n, char s, char *p, int w, int hh, int hr, int mr, int sd)
{
    
     
	name = new char[strlen(n)];
	strcpy(name,n);
	strcpy(pid,p);
	sex = s;
	weight = w;
	high = hh;
	char temp[5]; //通过身份证号码产生出身日期
	strncpy(temp,p+6,4);
	year = atoi(temp);
	strncpy(temp,p+10,2);
	temp[2] = '\0';
	month = atoi(temp);
	strncpy(temp, p+12, 2);
	temp[2] = '\0';
	day = atoi(temp);
	hour = hr;
	miniter = mr;
	second = sd;
}

人类的测试主函数

int main()
{
    
    
	//创建对象
	person Jack("James Chen",'M',"610103198901062493",160,180,23,34,35);
	Jack.print(); //输出人的属性值
	system("pause");
	Jack.walking(10,4); //行走10步,1/4秒走一步
	Jack.hearing("You are simple"); //听英文句子
	Jack.speek(1006); //说出整数num的英文句子
	cout<<endl;
	Jack.writing(); //书写汉字“曲”
	return 0;
}

Guess you like

Origin blog.csdn.net/uncle_ll/article/details/121802092