实验5继承和派生(二)

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

  1. 在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。

  2. 在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_ Cadre类中还包含数据成员wages(工资)。

  3. 对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。

  4. 在类体中声明成员函数,在类外定义成员函数。

  5. 在派生类Teacher_ Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、电话,然后再用cout语句输出职务和工资。


#include<iostream>

#include<string>

using namespace std;



class Teacher

{

protected:

    string TC_name = "富强";

    int TC_age = 10;

    string TC_sex = "民主";

    string TC_address = "文明";

    string TC_tel = "和谐";



    string Te_title = "自由";

public:

    void Te_display();

};



void Teacher::Te_display()

{

    cout << "姓名:" << TC_name << endl;

    cout << "年龄:" << TC_age << endl;

    cout << "性别:" << TC_sex << endl;

    cout << "职称:" << Te_title << endl;

    cout << "电话:" << TC_tel << endl;

    return ;

}



class Cadre

{

protected:

    string TC_name;

    int TC_age;

    string TC_sex;

    string TC_address;

    string TC_tel;



    string Ca_post = "平等";

};



class Teacher_Cadre : public Teacher, public Cadre

{

private:

    double T_C_wages = 5000;

public:

    void T_C_display();

};



void Teacher_Cadre::T_C_display()

{

    Te_display();

    cout << "职务:" << Cadre::Ca_post << endl;

    cout << "工资:" << T_C_wages << endl;



    return ;

}



int main()

{

    Teacher_Cadre T_C1;

    T_C1.T_C_display();



    return 0;

}

设计一个虚基类Person,包含姓名和年龄私有数据成员以及相关的成员函数;由它派生出领导类Leader,包含职务和部门私有数据成员以及相关的成员函数;再由Person派生出工程师类Engineer,包含职务和专业私有数据成员以及相关的成员函数;再由Leader和Engineer类派生出主任工程师类Chairman。并采用相关数据进行测试。


#include<iostream>

#include<string>

using namespace std;



class Person

{

private:

    string Per_name = "海绵宝宝";

    int Per_age;

public:

    Person()

        :Per_age(10)

    {

        cout << "初始年龄:" << Per_age << endl;

    }

    void Per_display(int addAge)

    {

        Per_age = Per_age + addAge;

        cout << "Person姓名:" << Per_name << endl;

        cout << "Person年龄:" << Per_age << endl;

       

        return ;

    }

    void ageDisplay()

    {

        cout << "\n当前年龄:" << Per_age << endl;

        return ;

    }

};



class Leader : virtual public Person

{

private:

    string Lea_post = "厨师";

    string Lea_department = "蟹堡王";

public:

    void Lea_display()

    {

        cout << "\nLeader年龄加5岁"  << endl;

        Per_display(5);

        cout << "Leader职务:" << Lea_post << endl;

        cout << "Leader部门:" << Lea_department << endl;



        return ;

    }

};



class Engineer : virtual public Person

{

private:

    string Eng_post = "美食家";

    string Eng_profession = "吃饭";

public:

    void Eng_display()

    {

        cout << "\nEngineer年龄加10岁"  << endl;

        Per_display(10);

        cout << "Engineer职务:" << Eng_post << endl;

        cout << "Engineer部门:" << Eng_profession << endl;

       

        return ;

    }    

};



class Chairman : public Leader, public Engineer

{

public:

    void Cha_ageDisplay()

    {

        ageDisplay();

        return ;

    }

};



int main()

{

    Chairman cha1;

    cha1.Lea_display();

    cha1.Eng_display();

    cha1.Cha_ageDisplay();

}

可以观察到,当Person作为虚基类时,年龄只初始化了一次,解决了二义性。