Г. Шилтд - Самоучитель C++ (PDF), страница 84
Описание файла
PDF-файл из архива "Г. Шилтд - Самоучитель C++ (PDF)", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 84 страницы из PDF
Виртуальная функция — это функция, обязательно являющаяся членом класса, объявляемая в базовом классе и переопределяемая в производном от базового классе. Процесс переопределения называют подменой (overriding).2. Виртуальными не могут быть функции, не являющиеся членами класса, атакже конструкторы.3. Виртуальные функции поддерживают динамический полиморфизм путемиспользования указателей базового класса.
Если указатель базового классауказывает на объект производного класса, содержащего виртуальную функцию, то выбор конкретной версии вызываемой функции определяется типомобъекта, на который он указывает.4. Чистая виртуальная функция — это функция, у которой нет определения вбазовом классе.5.
Абстрактный класс — это базовый класс, в котором содержится по крайнеймере, одна чистая виртуальная функция. Полиморфный класс — это класс, вкотором содержится, по крайней мере, одна виртуальная функция.6. Этот фрагмент неправилен, поскольку переопределение виртуальной функции должно обеспечивать тот же тип возвращаемого значения, тот же типПриложение В. Ответы на вопросы и решения упражнений621параметров и то же их количество, что и исходная функция. В данном случае, переопределенная функция f() отличается числом своих параметров.7. Да.Проверка усвоения материала в целом1.
// Демонстрация возможностей виртуальных функций^include <iostream>#include <cstdlib>using namespace std;class list (public:list *head;list *tail;list *next;int num;// указатель на начало списка// указатель на конец списка// указатель на следующий элемент списка// число для храненияlist () ( head = tail = next = NULL; }virtual void store(int i) = 0;virtual int retrieved = 0;// Создание списка типа очередьclass queue: public list (public:void store(int i) ;int retrieve d;queue operator+(int i) { store (i); return *this; }int operator —(int unused) { return retrieved; }}•void queue::store(int i)list *item;item = new queue;if (!item) {cout « "Ошибка выделения памяти\п";exit(l);item -> num = i;// Добавление элемента в конец спискаif(tail) tail -> next = item;tail = item;item -> next = NULL;if('head) head = tail;622___Самоучительint queue : : retrieve ( ){int i ;list *p;if (! head) {cout « "Список луст\п";return 0;// Удаление элемента иэ начала спискаi = head -> num;р = head;head = head -> next;delete p;return i;// Создание списка типа стекclass stack: public list {public:void store{int i) ;int retrieve ( ) ;stack operator^- (int i) { store(i); return *this; }int operator — {int unused) { return retrieved; }void stack: :store (int i){list *item;item = new stack;if (! item) {cout « "Ошибка выделения памяти\п";exit (1) ;}item -> num = i;// Добавление элемента в начало спискаif (head) item -> next = head;head = item;iff! tail) tail - head;int stack: : retrieve (}{int i;list *p;C++Приложение В.
Ответы на вопросы и решения упражнений623if (!head) {cout « "Список пуст\п";return 0;// Удаление элемента из начала спискаi = head -> num;р = head;head = head -> next;delete p;return i;int main(){// Демонстрация очередиqueue q_ob;q__ob + 1;q_ob + 2;q_ob + 3;coutcoutcoutcout« "Очередь : " ;« q_ob — ;« q_ob — ;« q_ob — ;cout « r\n' ;// Демонстрация стекаstack s_ob;s_ob + 1;s_ob + 2;s_ob 4 3;coutcoutcoutcout««««"Стек: ";s_ob — ;s_ob — ;s_ob — ;cout « '\n' ;return 0;12.
Отличие виртуальных функций от перегружаемых в том, что перегружаемыефункции должны отличаться либо числом, либо типом своих параметров.Подменяемая виртуальная функция должна иметь точно такой же прототип(поэтому такой же тип возвращаемого значения, такой же тип параметров ито же их число), как и исходная функция.624Самоучитель C++ГЛАВА 11Повторение пройденного1. Виртуальная функция — это функция, которая в базовом классе объявляетсяс ключевым словом virtual и затем в производном классе подменяется другойфункцией.2. Чистая виртуальная функция — это функция, которая в базовом классе неимеет определения функции.
Это означает, что функция обязательно должнаподменяться соответствующей ей функцией в производном классе..Базовыйкласс, который содержит, по крайней мере, одну чистую виртуальную функцию, называется абстрактным.3. Динамический полиморфизм достигается посредством использования виртуальных функций и указателей базового класса.4. Если в производном классе отсутствует подмена не чистой виртуальнойфункции, то производный класс будет использовать версию виртуальнойфункции из базового класса.5. Главным преимуществом динамического полиморфизма является гибкость.Главным его недостатком является некоторое снижение быстродействия.Упражнения11.12.
tinclude <iostream>using namespace std;template <class X> X min(X a, X b){if(a<=b) return a;else return b;}int main(){cout « min(12.2, 2.0);cout « endl;cout « min(3, 4);cout « endl;cout « min('c', 'a');return 0;ПриложениеВ.Ответынавопросыирешенияупражнений_6253.
# include <iostreara>^include <cstring>using namespace std;template <class X> int find(X object, X *list, int size){int i;for(i=0; i<size; iif (object == listfi]} return i;return -i;int main{)int a[]=U, 2, 3, 4};char *с="это проверка";double d[]-{l.l, 2.2, 3.3};cout « find(3, a, 4);cout « endl;cout « find('a', c, (int) strlen(c));cout « endl;cout « find(0.0, d, 3);return 0;4. Ценность родовых функций в том, что они позволяют определить общийалгоритм, который можно применить к разным типам данных. (Следовательно, не нужно явно задавать конкретные версии алгоритма.) Кромеэтого, родовые функции помогают реализовать основную идею программирования на C++, а именно "один интерфейс — множество методов".11.22.
// Создание родовой очереди^include <iostream>using namespace std;tfdefine SIZE 100template <class Qtype> class q_type (Qtype queue[SIZE]; // содержит очередьint head, tail;// индекс вершины и хвоста очередиpublic:q_type() { head = tail =0; }void q(Qtype num); // помещает объект в очередь626Самоучитель C++Qtype deq{};// извлекает объект из очереди};// Размещение значения в очередьtemplate <class Qtype> void q_type<Qtype>::q(Qtype num){if (tail+l==head || (tail+l==SIZE && Ihead)) {cout « "Очередь полна\п";return;}tail-H-;if {tail==SIZE) tail = 0; // замыкание циклаqueue[tail] = num;}// Удаление значения из очередиtemplate <class Qtype> Qtype q_type<Qtype>::deq (){if {head == tail) {cout « "Очередь пуста";return 0; // очередь пуста или какая-то иная ошибка}head++;if(head==SIZE) head = 0;return queue[head];// замыкание цикла}int main{){q_type<int> ql;q_type<char> q2;int i;for(i=l; iql.q(i);for(i=l; icout « "Первая очередь " « ql.deqO « "\ncout « "Вторая очередь " « q2.deq() « "\n}return 0;3.
^include <iostream>using namespace std;ПриложениеВ.Ответынавопросыирешенияупражнений_627template <class X> class input {X data;public:input (char *s, X man, X m a x ) ;template <class X>input <X> :: input (char *s, X min, X max){do {cout « s « "; ";cin » data;} while (data<min [| data>max) ;}int main{){input<int> 1("ввод целых", О, 10);input<char> с("ввод символов", 'A', 'Z'};return 0;11.32.
Инструкция throw вызывается еще до того, как управление передано в блок try.3. Вызывается символьная исключительная ситуация, а инструкция catch предназначена только для обработки исключительной ситуации типа указатель насимвол. (То есть для обработки символьной исключительной ситуации нетсоответствующей инструкции catch.)4. Если возбуждается исключительная ситуация, для которой не задано соответствующей инструкции catch, то вызывается функция terminate(), что может привести к аварийному завершению программы.11.42. Для инструкции throw нет соответствующей инструкции catch.3. Одним из способов решить проблему является создание обработчикаcatcb(int).
Другой способ — это перехватывать все исключительные ситуациис помощью обработчика catch(...).4. Все типы исключительных ситуаций перехватываются инструкцией catch(,..).5. ^include <iostream>^include <cstdlib>using namespace std;628double divide (double a, double b){try {if(!b) throw (b);}catch (double) {cout « "На ноль делить нельзя\п";exitU);}return a/b;int mainOcout « divide(10.0, 2.5) « endl;cout « divide(10.0, 0.0);return 0;11.51. По умолчанию оператор new возбуждает исключительную ситуацию при появлении ошибки выделения памяти. Оператор new(nothrow) при невозможности выделить память возвращает нулевой указатель.2.
р = new(nothrow) (int);if(!p) (cout « "Ошибка выделения памяти\п";try {р = new int;} catch (bad alloc ba} {™—cout « "Ошибка выделения памяти\п";Проверка усвоения материала главы 1 11. ^include <iostream>^include <cstring>using namespace std;// Родовая функция для поиска// наиболее часто встречающегося значенияtemplate <class X> X mode(X *data, int size)Приложение В. Ответы на вопросы и решения упражненийregister int t, w;X md, oldmd;int count, oldcount;oldmd = 0;oldcount = 0;for(t=0; t<size; t++) {md=data [ t ] ;count = 1;for(w = t+1; w < size; w+-l-)if (md==data [w] ) count++if {count > oldcount) {oldmd = md;oldcount = count;return oldmd;int main (){int i[] = {1, 2, 3, 4, 2, 3, 2, 2, 1, 5};char *p = "Это проверка";cout « "Значение для массива целых: " « rnode(i, 10) « endlcout « "Значение для массива символов: " « mode (p, (int)strlen (p) ) ;return 0;2.