【问题描述】
从类Person中派生出一个Teacher类,新增的属性有专业(specialty)、职称(position)和主讲课程(majorCourse)一门,并为这些属性定义相应的方法。
Person类的设计如下,空白处请补充完整。
class Person{
char name[10];
int age;
char sex;
public:
void Register(char *s,int n,char c) {
_______;
age=n; sex=(c=='m'?0:1);
}
char *getName() { _______; }
char getSex() { return sex==0?'m':'f'; }
int getAge() { _______; }
void showMe() {
cout<<getName()<<" "<<getSex()<<" "<<getAge()<<" ";
}
};
Teacher类由Person类公有派生出来,
主函数设计如下,请勿修改:
int main(){
Teacher t;
t.showMe();
t.teacherRegister("Zhang",38,'f',"Computer","Professor","C++");
t.showMe();
return 0;
}
提示:
(1)Teacher类必须有自己的构造函数进行数据的初始化,
而Person可以有也可以没有,当Person没有的时候,在Teacher中对Person的数据显示初始化即可。
(2)派生类在调用基类的函数时,不需要写基类名加上::。例如写Person::showMe()就有点多余。
(3)派生类继承了基类的数据成员,因此,在派生类Teacher中定义数据成员Person p;是错误的写法。
【样例输出】
XXX m 0 XXX XXX XXX
Zhang f 38 Computer Professor C++
#include <iostream>
#include <string.h>
using namespace std;
class Person{
char name[10];
int age;
char sex;
public:
void Register(char *s,int n,char c)
{
int len = strlen(s);
int i;
for(i=0;i<len;++i)
name[i] = s[i];
name[i] = ' ';
age=n;
sex=(c=='m'?0:1);
}
char *getName() { return name; }
char getSex() { return sex==0?'m':'f'; }
int getAge() { return age; }
void showMe() { cout<<getName()<<" "<<getSex()<<" "<<getAge()<<" "; }
};
class Teacher : public Person
{
private:
char * specialty;//专业
char * position;//职称
char * majorCourse;//主讲课程
public:
//Teacher类的构造函数(派生类构造函数必须给基类数据成员赋值)
//Teacher类必须有自己的构造函数进行数据的初始化,
//而Person可以有也可以没有,当Person没有的时候,在Teacher中对Person的数据显示初始化即可。
Teacher( char *n="XXX", char c='m', int a=0, char *s="XXX", char *p="XXX", char *m="XXX" )
{
Register(n,a,c);
int len1 = strlen(s);
specialty = new char[len1+1];
strcpy(specialty,s);
int len2 = strlen(p);
position = new char[len2+1];
strcpy(position,p);
int len3 = strlen(m);
majorCourse = new char[len3+1];
strcpy(majorCourse,m);
}
//因为基类没有定义的构造函数,只有默认给的构造函数,所以这里初始化基类构造函数没用,那就在函数体内使用一个相似的传参完成构造
void showMe() { Person::showMe(); cout<<specialty<<" "<<position<<" "<<majorCourse<<endl; }
//(2)派生类在调用基类的函数时,不需要写基类名加上::。例如写Person::showMe()就有点多余。
void teacherRegister( char *n, int a, char c, const char *s, const char *p, const char *m )
{
Register(n,a,c);
int len1 = strlen(s);
specialty = new char[len1+1];
strcpy(specialty,s);
int len2 = strlen(p);
position = new char[len2+1];
strcpy(position,p);
int len3 = strlen(m);
majorCourse = new char[len3+1];
strcpy(majorCourse,m);
}
~Teacher(){ delete [] specialty; delete [] position; delete [] majorCourse; }
};
int main()
{
Teacher t;
t.showMe();
t.teacherRegister("Zhang",38,'f',"Computer","Professor","C++");
t.showMe();
return 0;
}