Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Пример программы с использованием наследования классов





На базе класса студент создать класс магистр содержащий:

- ФИО магистра, номер учебной группы, текущий рейтинг, название специальности и номер телефона;

- методы для ввода и вывода данных;

- методы для возвращения член-данных класса.

Создать массив объектов класса. Осуществить его ввод и вывод. Вывести список магистров, рейтинг которых выше среднего. Осуществить поиск и вывод телефонов магистров заданной специальности.

#include <iostream.h>

class student

{

char FIO[20]; // ФИО студента

char gr[10]; // Группа студента

float reit; // Рейтинг студента

public:

void vvod() // Ввод данных

{

cout<<"\n Vvod fio: ";

cin>>FIO;

cout<<"\n Vvod gruppi: ";

cin>>gr;

cout<<"\n Vvod reitinga:";

cin>>reit;

}

void vivod() // Вывод данных

{

cout<<"\n FIO: "<<FIO;

cout<<"\n Gruppa: "<<gr;

cout<<"\n Reiting: "<<reit;

}

char * rFIO() // Функция, возвращающая ФИО

{

return FIO;

}

char * rgr() // Функция, возвращающая группу

{

return gr;

}

float rreit()// Функция, возвращающая рейтинг

{

return reit;

}

student ()

{

strcpy(FIO,"");

strcpy(gr,"");

reit=0;

}

// конструктор с тремя параметрами

student (char *initFIO, char *initGr, float initReit)

{

strcpy(FIO, initFIO);

strcpy(gr, initGr);

reit=initReit;

}

};

class magistr: public student

{

char spec[30];

int tel;

public:

void vvod()

{

student::vvod();

cout<<"\n Vvod specialnosti: ";

cin>>spec;

cout<<"\n Vvod telephone: ";

cin>>tel;

}

void vivod()

{

student::vivod();

cout<<"\n Specialnost: "<<spec;

cout<<"\n Telephone: "<<tel;

}

magistr ()

{

strcpy(spec,"");

tel=0;

}

// конструктор с тремя параметрами

magistr (char *initFIO, char *initGr, float initReit, char *initSpec, int initTel): student(initFIO, initGr, initReit)

{

strcpy(spec, initSpec);

tel=initTel;

}

char *rSpec()

{

return spec;

}

int rTel()

{

return tel;

}

};

int main()

{

magistr mas[10]; // массив объектов класса

int n;

cout<<"\n vvod n";

cin>>n;

for (int i=0; i<n; i++)

mas[i].vvod();

for (int i=0; i<n; i++)

mas[i].vivod();

// Поиск среднего рейтинга

float s=0, sr;

for (int i=0; i<n; i++)

s=s+mas[i].rreit();

sr=s/n;

cout<<"\n Sredniy reiting: "<<sr;

cout<<"\n Spisok otlichnikov: ";

for (int i=0; i<n; i++)

if (mas[i].rreit() > sr)

cout<<"\n"<<mas[i].rFIO();

// Поиск по введенному ФИО

cout<<"\n poisk po specialnosti: ";

char key[20];

cout<<"\n Vvod specialnosti: ";

cin>>key;

for (int i=0; i<n; i++)

if (!strcmp(mas[i].rSpec(), key))

{

cout<<”\n FIO: ”<<mas[i].rFIO();

cout<<”\t Telephone: ”<<mas[i].rTel();

}

}

Замечания. В конструкторе с тремя параметрами обратите внимание на синтаксис передачи параметров конструктору базового класса, после списка параметров конструктора magistr (но перед его телом), нужно вставить то, что называется инициализатором конструктора - двоеточие и имя базового класса с фактическими параметрами для его конструктора. Когда создается объект класса magistr с помощью следующего объявления:

magistr Ivanov(“Ivanov”, “VTV-267”, 79.4, “ASOIU”, 239494);

конструктор этого класса получает пять параметров. Первые три параметра средствами инициализатора передаются конструктору класса student.

После того, как выполнится конструктор класса student (создав подобъект базового класса), выполняется тело конструктора класса magistr, устанавливая переменные spec и tel равными четвертому и пятому параметрам.

Конструктору по умолчанию (без параметров) инициализатор не требуется, так как конструктору по умолчанию из базового класса не нужны параметры.

Когда объект класса magistr создается с помощью объявления

magistr bufer;

конструктор по умолчанию класса magistr сначала неявно вызывает конструктор по умолчанию класса student, только после чего выполняется собственно его тело, в котором переменные spec и tel получают нулевые значения

Теперь рассмотрим функцию vvod(). Эта функция заменяет функцию vvod, унаследованную от базового класса. Таким образом, в результате существует две разные функции vvod: одна является общедоступным членом класса student, а другая - общедоступным членом класса magistr. Их полными именами будут соответственно student::vvod() и magistr::vvod(). Выполнение функции magistr::vvod() начинается с обращения к базовому классу и вызова student::vvod() для ввода ФИО, группы и рейтинга (производный от student класс не может напрямую обращаться к закрытым данным FIO, gr, reit, так как эти переменные являются закрытыми членами класса student). Затем функция позволяет ввести переменные spec и tel (закрытые члены класса magistr) и заканчивает работу.

Функция vivod() использует аналогичную стратегию.

Не смотря на то, что в порожденном классе не были замещены функции, возвращающие значения член-данных базового класса, их можно использовать в основной функции. Это связано с тем, что эти функции являются общедоступными в базовом классе и вид доступа не меняется, так как использовался вид наследования public. Поэтому объект порожденного класса неявно преобразуется к объекту базового класса, для которого вызывается соответствующая функция. Если бы был использован вид порождения private, то в порожденном классе необходимо было бы переопределить функции, возвращающие значения член-данных базового класса, например, следующим образом.

Пример.

// Функция, возвращающая рейтинг в классе магистр

float rreit()

{

return student::reit();

}

 

Виртуальные функции

Date: 2016-05-13; view: 596; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию