终于考完了万恶的期末考,有时间把落下的blog更一下
异质链表
异质链表means链表内节点类型可以不是同一种。
下面放上课程作业(一个小型的学校信息管理系统)中成员类型定义的.h文件。
其中有一个抽象节点(Node)基类Person类,其它类都在此基础上继承;
故在链表(HeterList)类中,定义链表头指针时,只需要将头指针定义为基类类型即可通过该头指针指向其继承类。
#include <iostream>
#include <string>
using namespace std;
//友元类需要事先声明
class HeterList;
/*
*节点类,各类class的定义
*/
//抽象基类 Person
class Person
{
friend class HeterList;
public:
//构造函数
//Person():_name(""),_sex('M'),_age(0),_IDnumber(""),_next(NULL){}
Person(char *name, char sex, int age, char *IDnumber)
:_sex(sex),_age(age),_next(NULL)
{
strcpy_s(Person::_name, name);
strcpy_s(Person::_IDnumber, IDnumber);
}
//纯虚函数
virtual void addNode() = 0; //将对象添加进链表,变成一个节点
virtual void display() = 0; //显示信息
//析构函数
~Person() {}
//希望与派生类分享,但不想被其他公共访问的成员
protected:
char _name[20];
char _sex;
int _age;
char _IDnumber[20];
static Person *_ptr; //定义一个指向Person类对象的静态指针
Person *_next; //指向下一个节点的指针
};
//教师类
class Teacher:public Person
{
friend class HeterList;
public:
//构造函数
//Teacher():Person(),_fund(0),_major(""),_salary(0){}
Teacher(char *name, char sex, int age, char *IDnumber, int fund, char *major, int salary)
:Person(name, sex, age, IDnumber),_fund(fund),_salary(salary)
{
strcpy_s(Teacher::_major, major);
}
//重写将对象添加进链表函数
void addNode()
{
_ptr = new Teacher(_name, _sex, _age, _IDnumber, _fund, _major, _salary);
}
//重写信息显示函数
void display()
{
cout<<"Name:"<<_name<<endl;
cout<<"Sex:"<<_sex<<endl;
cout<<"Age:"&l