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


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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;

}

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

{

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

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

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

}

// Определение виртуальной функции в базовом классе

virtual void fun()

{

cout<<"\n Virtual function (class student)";

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

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

cin>>FIO;

}

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;

}

void fun() // Переопределение виртуальной функции

{

cout<<"\n Virtual function (class magistr)";

cout<<"\n FIO: "<<rFIO();

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

}

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()

{

student *mas[10];

student buf[5];

magistr buf2[5];

cout<<"\n vvod studentov";

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

buf[i].vvod();

cout<<"\n vvod magistrov";

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

buf2[i].vvod();

// Формирование массива указателей на объекты разных классов

int j=0;

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

{

mas[j]=&buf[i];

j++;

mas[j]=&buf2[i];

j++;

}

// Вывод с помощью виртуальной функции

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

(*mas[i]).vivod();

// Применение виртуальной функции

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

(*mas[i]).fun();

// Вывод с помощью виртуальной функции

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

(*mas[i]).vivod();

}

Замечание.

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

student *mas[50];

student buf[50];

magistr buf2[50];

cout<<"\n vvod massiva";

int x=10,i=0,j=0,n=0;

while (x!=0)

{

cout<<"\n Press 1 for enter student";

cout<<"\n Press 2 for enter magistr";

cout<<"\n Press another key for exit\n";

cin>>x;

if (x==1)

{

buf[i].vvod();

mas[n]=&buf[i];

i++;

n++;

}

else

if (x==2)

{

buf2[j].vvod();

mas[n]=&buf2[j];

j++;

n++;

}

else

{

cout<<"\n Exit";

x=0;

}

}

При этом n будет содержать количество элементов обрабатываемого массива, поэтому все циклы дальше будут идти до n.

cout<<"\n Output array: \n";

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

(*mas[i]).vivod();

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

(*mas[i]).fun();

cout<<"\n Output array: \n";

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

(*mas[i]).vivod();


Перегрузка операций

Любой встроенный в язык C++ тип данных кроме внутреннего представления этих данных определяет неявно еще и набор операций над этими данными.

Основным преимуществом объектно-ориентированного программирования вообще и языка С++ в частности является возможность создавать новые, определенные caмим пользователем типы данных. Определение типа данных включает и определение действий, которые пользователь хотел бы над этими данными выполнять.

Возможность представления новых типов вместе с множеством действий, которые могут выполняться над этими типами, в языке C++ дает механизм классов, а механизм перегрузки операций позволяет обеспечить более традиционную и удобную запись действий над объектами.

Функция operator может быть использована для расширения области применения следующих операторов:

+ - * / % ^ & | ~ = < > += /=

%= ^= &= |= << >> >>= <<= ==!= <= >= && ||

++ -- ->*, -> [] () new delete

Нельзя перегружать операции:

..*?*:: sizeof

Конкретный экземпляр операции зависит от типа и числа аргументов. Функция operator используется для расширения области приложения операции # в следующей форме:

<тип_возврата> operator # (<список аргументов>),

где # - знак перегружаемой операции из перечисленных.

Правила перегрузки операций.

1. Нельзя использовать для операций новые символы, кроме тех, что определены в языке (например, нельзя использовать $).

2. Нельзя перегружать и определять новые операции для встроенных типов (например, нельзя определить операцию сложения массивов, эту задачу можно решить, определив класс, реализующий понятие массива, и операцию сложения в нем).

3. Нельзя изменить приоритета операции.

4. Нельзя изменить синтаксис операции в выражении (например, если операция определена в языке унарной, то ее нельзя переопределить как бинарную, префиксную операцию нельзя перегрузить как постфиксную).

5. Перегрузить можно только те операции, для которых по крайней мере один аргумент представляет тип данных, определенный пользователем. Поэтому функция оператор должна быть либо член-функцией либо внешней дружественной функцией для этого типа (но не то и другое вместе, иначе возникнет двусмысленность).

6. При перегрузке унарной операции она не должна иметь аргументов, если является членом класса, и должна иметь один аргумент (ссылку на объект), если является внешней функцией. Если унарная операция перегружается как член-функция, ей передается неявный аргумент - указатель this на текущий объект.

Для любой унарной операции # запись #obj интерпретируется как

- obj.operator #(), если операция является членом класса,

- operator #(obj), если операция является внешней функцией.

Пример.

// член-функция // внешняя функция

1) class person 2) class person

{int age; {int age;

public: public:

void operator++() friend void operator++(person&);

{++age;} };

}; void person::operator++(person& ob)

int main() {++ob.age;}

{person jon; int main()

++jon; {person jon;

} ++jon;

}

7. При перегрузке бинарной операции она должна иметь один аргумент (ссылку на объект), если является членом класса, и два аргумента (ссылки на объекты), если является внешней функцией. Бинарная операция, перегружаемая как член-функция, получает один неявный аргумент (первый) - указатель this на текущий объект.

Таким образом, для любой бинарной операции # запись objl#obj2 может интерпретироваться как:

- obj1.operator#(obj2), если операция определена как член класса,

- operator#(obj1, obj2), если операция определена как внешняя функция класса.

Бинарные арифметические операции +, -, *, / должны возвращать объект класса, для которого они используются.

8. Следующие операции

= [] () ->

должны перегружаться только как члены класса.

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



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