实验5继承和派生(二)
分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_ Cadre(教师兼干部)。要求:
-
在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。
-
在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_ Cadre类中还包含数据成员wages(工资)。
-
对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。
-
在类体中声明成员函数,在类外定义成员函数。
-
在派生类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作为虚基类时,年龄只初始化了一次,解决了二义性。