Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Файл 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...