• Person类和Teacher类(公有派生)


    【问题描述】
    从类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;
    }
    
  • 相关阅读:
    Java反射理解
    Object的wait和Thread的sleep
    Android媒体解码MediaCodec,MediaExtractor
    图片加载AsyncTask并发问题
    LruCache缓存机制
    Android高效加载大图
    Android Studio编写运行测试纯java代码可带main()函数
    APP支付宝登录第三方授权如何签约入口在哪里
    Xcode使用HTTP配置
    OC编码问题输出中文
  • 原文地址:https://www.cnblogs.com/yuzilan/p/10626142.html
Copyright © 2020-2023  润新知