问题
假设两个类,中间有些特征或者功能是有交叉的地方。现在想要合并两个类为一个新的类。简单的合并会面临的问题:代码大量重复! 因此需要通过采用继承式的抽象方法描述万物,不用重复的造轮子,减少代码重复。
继承的概念
- 从一个或多个以前定义的类(基类)产生新类的过程称为派生
- 新产生的类又称为派生类
- 类的继承(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
{
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);
Jack.hearing("You are simple");
Jack.speek(1006);
cout<<endl;
Jack.writing();
return 0;
}
|