PTA-6-1 多重继承

分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)类,要求:

  1. 在两个基类中都包含姓名,年龄,性别,地址,电话等数据成员。
  2. 在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务)。在Teacher_Cadre类中还包含数据成员wages(工资)。
  3. 对两个基类中的姓名、年龄、性别、地址、电话等数据成员使用同样的名字,在引用这些数据成员时,指定作用域。
  4. 在类体中声明成员函数,在类体外定义成员函数。
  5. 在派生类Teacher_Cadre的成员函数show中调用Teacher类的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务和工资。
  6. 函数接口定义:

    在这里描述类和函数接口:
    #include <iostream>
    #include <string>
    using namespace std;
    class Teacher{
    protected:
        string name;
        int age;
        char gender;
        string addr;
        string phone;
        string title;
    public:
        Teacher(){}
        Teacher(string name,int age,char gender,
                string addr,string phone,string title);
        void display();
    };
    class Cadre{
    protected:
        string name;
        int age;
        char gender;
        string addr;
        string phone;
        string post;
    public:
        Cadre(){}
        Cadre(string name,int age,char gender,
                string addr,string phone,string post);
        void display();
    };
    class Teacher_Cadre:public Teacher,public Cadre
    {
    protected:
        int wages;
    public:
        Teacher_Cadre(string name,int age,char gender,
                string addr,string phone,string title,
                string post,int wages);
        void show();
    };
    

    为简化,string类型的成员都是不带空格的字符串。

    裁判测试程序样例:

    在这里给出函数被调用进行测试的例子:
    int main()
    {
        int mode;
        string name;
        int age;
        char gender;
        string addr;
        string phone;
        string title;
        string post;
        int wages;
        Teacher *t;
        Cadre *c;
        Teacher_Cadre *tc;
        cin>>mode;
        cin>>name>>age>>gender>>addr>>phone>>title>>post>>wages;
        switch(mode)
        {
            case 1:
                t = new Teacher(name,age,gender,addr,phone,title);
                t->display();
                cout<<endl;
                break;
            case 2:
                c = new Cadre(name,age,gender,addr,phone,post);
                c->display();
                cout<<endl;
                break;
            case 3:
                tc = new Teacher_Cadre(name,age,gender,addr,phone,title,post,wages);
                tc->show();
                cout<<endl;
        }
        return 0;
    }
    
    
    /* 请在这里填写答案 */
    

    输入样例1:

    在这里给出一组输入。例如:

    1
    张三
    23
    M
    成都某大学软件工程专业
    13888888888
    讲师
    教务科长
    5000
    

    注意:性别的取值为'F'或'M',其中'F'表示女性,'M'表示男性。

    输出样例1:

    在这里给出相应的输出。例如:

    name:张三,age:23,gender:男,addr:成都某大学软件工程,phone:13888888888,title:讲师
    

    答案代码如下:

    Teacher::Teacher(string name,int age,char gender,
                string addr,string phone,string title)  //一定不要忘记类外实现的成员函数要加类名前缀
                {
                    this->name=name;           //形参和实参同名,用this指针指明
                    this->age=age;
                    this->gender=gender;
                    this->addr=addr;
                    this->phone=phone;
                    this->title=title;
                }
     void Teacher::display()
     {
         cout<<"name:"<<name<<",age:"<<age<<",gender:"<<(gender=='M'?"男":"女")<<",addr:"<<addr<<",phone:"<<phone<<",title:"<<title;
         //if(gender=='M')  cout<<"男";   else  cout<<"女";   
         
     }     //这里对于性别的输出,可以是用if语句判断输出,我偷懒简化代码用了个三目运算符
    Cadre::Cadre(string name,int age,char gender,
                string addr,string phone,string post)
    {
                    this->name=name;
                    this->age=age;
                    this->gender=gender;
                    this->addr=addr;
                    this->phone=phone;
                    this->post=post;
    }
     void Cadre::display()
     {
         cout<<"name:"<<name<<",age:"<<age<<",gender:"<<(gender=='M'?"男":"女")<<",addr:"<<addr<<",phone:"<<phone<<",post:"<<post;
        // if(gender=='M')  cout<<"男";   else cout<<"女";
     }
    Teacher_Cadre::Teacher_Cadre(string name,int age,char gender,
                string addr,string phone,string title,
                string post,int wages)
    {
                    this->Teacher::name=name;     //因为是多重继承,会出现两个类有部分对象重名
                    this->Teacher::age=age;       //所以要用类名前缀指明用的是哪个类的,不然编译器分不清的
                    this->Teacher::gender=gender;
                    this->Teacher::addr=addr;
                    this->Teacher::phone=phone;
                    this->Teacher::title=title;    
                    this->Cadre::post=post;       //注意区分,post是Cadre类的,加上类名前缀
                    this->wages=wages;
    }
    void Teacher_Cadre::show()
    {
        Teacher::display();
        cout<<",post:"<<post<<",wages:"<<wages;
    }

    这道题没什么难度,注意多重继承要加类名前缀指明用的是哪个类的数据就好

### PTA平台 C++ `#include <iostream>` 使用问题及解决方案 在PTA平台上编写C++程序时,`#include <iostream>` 是用于引入标准输入输出流库的关键指令。此头文件不仅定义了诸如 `cin` 和 `cout` 这样的基本输入输出流对象,还隐含地包含了其他几个重要的I/O流组件,比如 `ios`, `streambuf`, `istream`, `ostream` 以及 `iosfwd`[^1]。 当遇到编译错误或运行异常时,可以考虑以下几个方面来排查并解决问题: #### 正确包含头文件 确保只使用一次 `#include <iostream>` 来导入必要的命名空间和声明。重复包含同一头文件可能会引起冲突或冗余定义的问题。通常情况下,在源代码文件顶部放置这行就足够了: ```cpp #include <iostream> ``` #### 命名空间管理 为了避免全局命名空间污染,建议显式指定来自 `std::` 的成员而不是通过 `using namespace std;` 将整个标准库拉入当前作用域内。这样做的好处是可以减少潜在的名字冲突风险,并使依赖关系更加清晰明了。例如: ```cpp int main() { std::cout << "Hello World!" << std::endl; } ``` #### 输入处理函数的选择 对于字符串读取操作,特别是涉及多字符分隔符的情况,应该选用合适的重载版本的 `getline()` 方法。根据参数列表的不同,存在多个变体可供选择,其中最常用的形式如下所示: - `istream& getline(istream& is, string& str)`:从给定的输入流中读取直到换行符为止的内容到字符串变量 `str` 中; - `istream& getline(istream&& is, string& str)`:与前者相似,但是接受右值引用作为第一个参数,适用于临时对象传递场景;另外两个带有额外终止字符参数的版本则允许自定义结束标志[^2]。 #### 处理多重继承中的虚基 如果项目涉及到复杂的层次结构设计,则需要注意如何妥善处理可能存在的菱形继承等问题。此时可以通过声明虚拟基的方式来避免二义性和内存布局上的混乱。不过这个问题相对独立于 I/O 流的具体实现细节之外[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值