功能需求:
1.所有同学Student都有名字name,都要学习Study
2.所有同学都要上体育课PE,但是男生是打篮球,女生是打排球
3.放学后,男生会去打游戏,女生会去逛街,各自干自己的事
4.数据来源于文件student.txt
注意student.txt文件需另存为ANSI编码格式
--------------------------------------------------------------------------------------------------------------------------------
Student.h源代码
#pragma once
#include <string>
#include <iostream>
class Student //父类
{
public:
Student(std::string name); //父类构造函数
void Study();
virtual void PE() = 0; //纯虚函数
protected:
std::string _name;
};
class Boy : public Student //子类
{
public:
Boy(std::string name); //子类构造函数
void PE(); //虚函数
void PlayGame(); //子类自己的成员函数
};
class Girl : public Student //子类
{
public:
Girl(std::string name); //子类构造函数
void PE(); //虚函数
void Shopping(); //子类自己的成员函数
};
Student.cpp源代码
#include "Student.h"
using namespace std;
Student::Student(std::string name):_name(name)
{
}
void Student::Study()
{
cout << _name << "正在学习" << endl;
}
Boy::Boy(std::string name):Student(name) //用父类构造函数实现继承的成员变量初始化
{
}
void Boy::PE()
{
cout << _name << "在打篮球" << endl;
}
void Boy::PlayGame()
{
cout << _name << "在打游戏" << endl;
}
Girl::Girl(std::string name):Student(name) //用父类构造函数实现继承的成员变量初始化
{
}
void Girl::PE()
{
cout << _name << "在打排球" << endl;
}
void Girl::Shopping()
{
cout << _name << "在逛街" << endl;
}
main.cpp源代码
#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <fstream>
#include "Student.h"
using namespace std;
ifstream& operator>>(ifstream& ifs, vector<Student*>& all)
{
string temp1, temp2;
ifs >> temp1 >> temp2; //连续流入两个string,第一个是男生/女生,第二个是名字
if (temp1 == "男生")
{
all.push_back(new Boy(temp2)); //如果是男生就创建男生对象,然后往数组里插入一个指向男生对象的指针
}
else
{
all.push_back(new Girl(temp2)); //如果是女生就创建女生对象,然后往数组里插入一个指向女生对象的指针
}
return ifs;
}
int main()
{
vector<Student*> allStudents; //父类指针数组
ifstream ifs;
ifs.open("student.txt", ios::in); //打开文件
if (!ifs)
{
cout << "文件打开失败" << endl;
exit(0);
}
while (!ifs.eof()) //到文件末尾才结束循环
{
ifs >> allStudents; //重载了>>运算符
}
ifs.close(); //关闭文件
for (Student* ps : allStudents) //遍历数组
{
ps->Study();
ps->PE(); //通过父类指针调用子类对象的函数
//RTTI:运行时类型识别
if (typeid(*ps) == typeid(Boy)) //如果父类指针指向男生子类对象
{
Boy* pb = dynamic_cast<Boy*>(ps); //父类指针转换为子类指针,向下类型转换
pb->PlayGame(); //子类指针才能调用子类成员函数
}
else //如果父类指针指向女生子类对象
{
Girl* pg = dynamic_cast<Girl*>(ps); //父类指针转换为子类指针,向下类型转换
pg->Shopping(); //子类指针才能调用子类成员函数
}
}
}