Файл list.h–Определение классов
Абстрактный класс Person содержит абстрактные(чистые виртуальные) функции Show() и Input(), которые должны быть определены в производных классах. В классе Person объявлен дружественный ему класс List.
class Person { public: Person(); Person(char*,int); virtual~Person(){}; virtual void Show()=0; //показать объект virtual void Input()=0; //ввести значения данных объекта friend class List; protected: char name[20]; //имя персоны int age; //возраст персоны Person* next; //указатель на следующий объект в списке };
class Student:public Person{ public: Student(); Student(char* NAME,int AGE,float GRADE); void Show(); void Input(); protected: float grade; //рейтинг };
class Teacher:public Person{ public: Teacher(); Teacher(char* NAME,int AGE,int WORK); void Show(); void Input(); protected: int work; //рабочий стаж };
class List { private: Person* begin; //указатель на начало списка public: List(); ~List(); void Insert(Person*); //вставить в список объект void Show(); //показать весь список };
Файл person.cpp – Определение функций класс Person
#include<stdlib.h> #include<iostream.h> #include<string.h> #include"list.h"
Person::Person() {strcpy(name,"NONAME"); age=0; next=0;};
Person::Person(char*NAME,int AGE) { strcpy(name,NAME); age=AGE; next=0;} Файл student.cpp–Определение функций класса Student
#include<stdlib.h> #include<iostream.h> #include<string.h> #include"list.h"
Student::Student() {grade=0;}
Student::Student(char* NAME,int AGE,float GRADE):Person(NAME,AGE) { grade=GRADE; next=0; }
void Student::Show(){cout<<"name="<<name<<" age="<<age<<" grade="<<grade<<endl;}
void Student::Input() { cout<<"name=";cin>>name; cout<<"age=";cin>>age; cout<<"grade=";cin>>grade; }
Файл teacher.cpp– Определение функций класса Teacher
#include<stdlib.h> #include<iostream.h> #include<string.h> #include"list.h"
Teacher::Teacher() {work=0;}
Teacher::Teacher(char* NAME,int AGE,int WORK):Person(NAME,AGE) { work=WORK; next=0; }
void Teacher::Show(){cout<<"name="<<name<<" age="<<age<<" work="<<work<<endl;}
void Teacher::Input() { cout<<"name=";cin>>name; cout<<"age=";cin>>age; cout<<"work=";cin>>work; }
Файл list.cpp–Определение функций класса List
#include<stdlib.h> #include<iostream.h> #include<string.h> #include"list.h" List::List(){begin=0;} //создается пустой список List::~List(){ Person*r; //проходим по списку и удаляем каждый объект while(begin!=0){ r=begin; begin=begin->next; delete r;}}
void List::Insert(Person*p){ Person *r; //вставляем объект в начало списка r=begin; begin=p; p->next=r;}
void List::Show() {Person *r; r=begin; //проходим по списку и вызываем для каждого объекта //его виртуальную функцию Show while(r!=0) {r->Show(); r=r->next;} }
Файл main.cpp–Демонстрационная программа
#include<iostream.h> #include"list.h" #include<process.h> int main() { List list; Student* ps; Teacher* pt; ps=new Student("Ivanov",21,50.5); list.Insert(ps); pt=new Teacher("Petrov",34,10); list.Insert(pt); ps=new Student; ps->Input(); list.Insert(ps); pt=new Teacher; pt->Input(); list.Insert(pt); list.Show(); system("pause"); return 0; }
Упражнения Упражнение 1. В этом упражнении мы покажем, что функции-члены базового и производного классов не составляют множество перегруженных функций, т.е. функция set класса CDerived скрывает видимость функции-члена CBase::set, а не перегружает ее. Вызов функции-члена базового класса из производного в этом случае приводит к ошибке при компиляции. В среде Microsoft Visual C++ создайте следующую программу и попытайтесь ее откомпилировать.
#include<iostream.h> class CBase { protected: int x; public: CBase(int); void print(); void set(int); }; CBase::CBase(int X):x(X){} void CBase::print(){cout<<x<<endl;} void CBase::set(int X){x=X;}
class CDerived:public CBase { protected: int y; public: CDerived(int,int); void print(); void set(int,int); }; CDerived::CDerived(int X,int Y):CBase(X),y(Y){} void CDerived::print(){cout<<x<<' '<<y<<endl;} void CDerived::set(int X,int Y){x=X;y=Y;}
int main() { CDerived ob(5,6); ob.set(7,8); ob.print();
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|