资源描述
C++面向对象程序设计大作业
利用虚函数实现多态:
(1)设计Person类,要求具有用于表示姓名的保护数据成员:string szName; 实现信息打印的公有成员函数:void Print()。其中,Print函数设计为虚函数,输出的信息格式为:“Person 姓名”。
(2)从Person类派生Student类,添加用于表示学号的保护数据成员:int iNumber;重定义用于信息打印的公有成员函数:void Print()。其中,Print函数输出的信息格式为:“Student 姓名 学号”。
(3)从 Person类派生Teacher类,添加用于表示教龄的保护数据成员:int iYear;重定义用于信息打印的公有成员函数:void Print()。其中,Print函数输出的信息格式为:“Teacher 姓名 教龄”。
(4)从Student类派生Graduate类,添加用于表示研究方向的保护数据成员:string szResearch;重定义用于信息打印的公有成员函数:void Print()。其中,Print函数输出的信息格式为:“Graduate 姓名 研究方向”
在main函数中根据用输入的整数动态创建一个Person类的对象指针数组。用户依次输入对象信息(对象类别及其相应的数据成员值),根据对象类别动态创建相应的对象并赋给相应的对象指针数组元素。全部录入后,根据用户输入要显示的对象信息在数组中的位置,调用Print函数在屏幕上打印出相应对象的信息。如果用户输入“exit”,则退出。
输入: 对象指针数组的长度;
对象类型及对象信息(输入方式见输入样例);
要显示的对象在数组中的位置;
exit。
输出: 用户要求显示的对象信息。
输入样例: 4
Person Zhang
Student Zhao 200905
Graduate Li 200905 DataMining
Teacher Luo 10
0
2
exit
输出样例: Person Zhang
Graduate Li 200905 DataMining
程序:
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Person
{
public:
Person(const string& name);
virtual void Print() const;
protected:
string szName;
};
Person::Person(const string& name):szName(name)
{
}
void Person::Print() const
{
cout << "Person " << szName << endl;
}
class Student : public Person
{
public:
Student(const string& name, int number);
void Print() const;
protected:
int iNumber;
};
Student::Student(const string& name, int number):Person(name),iNumber(number)
{
}
void Student::Print() const
{
cout << "Student " << szName << " " << iNumber << endl;
}
class Teacher : public Person
{
public:
Teacher(const string& name, int year);
void Print() const;
protected:
int iYear;
};
Teacher::Teacher(const string& name, int year):Person(name),iYear(year)
{
}
void Teacher::Print() const
{
cout << "Teacher " << szName << " " << iYear << endl;
}
class Graduate : public Student
{
public:
Graduate(const string& name, int number, string major);
void Print() const;
protected:
string szResearch;
};
Graduate::Graduate(const string& name, int number, string major):
Student(name, number), szResearch(major)
{
}
void Graduate::Print() const
{
cout << "Graduate " << szName << " " << iNumber << " " << szResearch << endl;
}
int main()
{
// 对象指针数组长度
int psNum;
cin >> psNum;
// 对象指针数组
Person* *psArr = new Person*[psNum];
// 对象类型、姓名、学号、教龄、研究方向
string szType, szName, szMajor;
int iNumber, iYear;
// 根据输入的对象信息创建不同类型的对象
for(int i=0; i<psNum; i++)
{
cin >> szType;
if(szType == "Person")
{
cin >> szName;
psArr[i] = new Person(szName) ;
}
else if(szType == "Student")
{
cin >> szName >> iNumber;
psArr[i] = new Student(szName, iNumber);
}
else if(szType == "Teacher")
{
cin >> szName >> iYear;
psArr[i] = new Teacher(szName, iYear);
}
else if(szType == "Graduate")
{
cin >> szName >> iNumber >> szMajor;
psArr[i] = new Graduate(szName, iNumber, szMajor);
}
else
{
}
}
// 需要打印信息的对象下标
string szIdx;
int objIdx;
cin >> szIdx;
while(szIdx != "exit")
{
// 对象下标
objIdx = atoi(szIdx.c_str());
objIdx = max(0, min(objIdx, psNum));
// 输出对象信息
psArr[objIdx]->Print();
cin >> szIdx;
}
// 释放对象内存
for(int i=0; i<psNum; i++)
{
if(psArr[i]) delete psArr[i];
}
// 释放对象指针数组
delete[] psArr;
return 0;
}
展开阅读全文