виде выполнить снятие денег, поскольку для разных типов счетов эта операция различна. Поэтому функция Account: withdrawal () объявлена чисто виртуальной (с помошью "« о" в конце объявления). Конструктор класса Account начинается с автоматического вызова конструктора LinkedListObject, который добавляет текущий счет к концу связанного списка объектов Account. Затем конструктор Account создает уникальную для каждого счета информацию, записывая номер счета и начальный баланс (который приравнивается нулю, если при создании счета не был задан другой баланс). Затем увеличивается на единицу значение статического члена count, с помощью которого отслеживается количество существующих в данный момент объектов Account. <strong>Для</strong> одного класса существует только одна копия каждого статического объекта. К ней имеют доступ все объекты класса. Функции accountNoO и accountBalar.ee (} служат для того, чтобы предоставлять возможность считывания номера счета и информации о балансе из внешнего мира, но не допускать непосредственного изменения этих значений. Функции-члены Account: : first (; и next () переопределяют свои более ранние версии из класса LinkedListObject. Без этих на первый взгляд бессмысленных функций пользователь должен был бы сам приводить тип объектов LinkedListObject, которые возвращают функции first () и next (), к типу Account. Функции display () и type() придают всем счетам одинаковый формат отображения. Подкласс checking класса Account достаточно прост. Конструктор класса Checking не делает ничего, кроме передачи аргументов конструктору класса Account. Единственная настоящая функция-член в этом классе — это withdrawal О , которая реализует правила работы с чековыми счетами. Класс Savings идентичен в этом классу Checking: все, что он делает, — это реализует метод withdrawal (J. Любой подкласс класса Account, который не переопределяет функцию withdrawal (), будет виртуальным, и вы не сможете создать объект этого класса. Функции, составляющие главную программу, теперь упрощены до предела. Функция ge~ Account () создает счет класса checking или Savings (в зависимости от символа, введенного пользователем). Это единственное место в программе, где происходит непосредственное обращение к подклассам класса Account. Функция displayResult () просматривает связанный список, требуя от каждого объекта отобразить свое содержимое, не интересуясь при этом деталями того, как именно сберегательные или чековые счета (или любые другие) будут это выполнять. Функция process!) имеет еще более впечатляющий вид. Она выполняет вложения (которые обрабатывает функция Account: :deposit()) и снятия (которые обрабатывают функции Savings::withdrawal{) и Checking::withdrawal(}, в зависимости от типа объекта, на который указывает pAccount). Обратите внимание на то, какой привлекательной теперь стала функция process (). Во-первых, полностью исчезла избыточность, которая появлялась благодаря существованию разных версий этой функции. Более важно то, что логика функции process!) значительно упростилась. Теперь программист может Глава 23. <strong>Р</strong>азложение классов 261
сконцентрироваться на работе этой функции, не волнуясь о внутренних особенностях разных типов счетов. Задача, которую решает Budget3, довольно проста. Но сравнение разных версий программы Budget позволит понять отличия между чисто функциональной программой (Budgetl) и ее развитием — через объектно-основанную программу без наследование (Budget2) в полностью объектно-ориентированную программу (Budget3). 262 Часть IV. Наследование
- Page 3 and 4:
y Stephen R. Davis IDG BOOKS WORLDW
- Page 5 and 6:
ББК32.973.26-018.2 я 75 Д94 У
- Page 7 and 8:
Содержание Об авто
- Page 9 and 10:
Сравнение указател
- Page 11 and 12:
Работа с деструкто
- Page 13 and 14:
Моим друзьям и семь
- Page 15 and 16:
Введение 0
- Page 17 and 18:
В предыдущем издан
- Page 19 and 20:
использованные в э/
- Page 21 and 22:
В э/ной наани... И но
- Page 23 and 24:
Язык С оказался дей
- Page 25 and 26:
ше использовать им
- Page 27 and 28:
Таким многословным
- Page 29 and 30:
Оформленные таким
- Page 31 and 32:
как результата выч
- Page 33 and 34:
Объявление /газных
- Page 35 and 36:
Начиная с этой стро
- Page 37 and 38:
объявление перемен
- Page 39 and 40:
Эти символы помога
- Page 41 and 42:
Окончание табл. 3.1 П
- Page 43 and 44:
выполнение tjHafutMX оп
- Page 45 and 46:
Глава 4 Выполнение
- Page 47 and 48:
как соотношения ме
- Page 49 and 50:
Другие системы счи
- Page 51 and 52:
Оператор & определя
- Page 53 and 54:
Зачем придуманы эт
- Page 55 and 56:
2-я последовательно
- Page 57 and 58:
} return 0; Программа whil
- Page 59 and 60:
ной цикла. Условие
- Page 61 and 62:
Но... ничто не вечно
- Page 63 and 64:
Вложенные команды
- Page 65 and 66:
\ case 3: //' обработка с
- Page 67 and 68:
В э&ои час&и... Выпол
- Page 69 and 70:
Согласно синтаксис
- Page 71 and 72:
И аргументы, и возв
- Page 73 and 74:
} cout « "Эта программ
- Page 75 and 76:
Такие аналогии меж
- Page 77 and 78:
} int localVariable; static int sta
- Page 79:
С помощью массивов
- Page 82 and 83:
Выход за границы ма
- Page 84 and 85:
f or i int i = 0 ; i< sizeOfloat. A
- Page 86 and 87:
cout
- Page 88 and 89:
Обработка символов
- Page 90 and 91:
расположении перем
- Page 92 and 93:
Теперь используем
- Page 94 and 95:
*pintvar = 100. С не вызыв
- Page 96 and 97:
эта переменная дос
- Page 98 and 99:
сохранение значени
- Page 100 and 101:
Повторное знакомст
- Page 102 and 103:
Использование указ
- Page 104 and 105:
заканчивается полу
- Page 106 and 107:
} charArrayflO] - 'О'; * (charArra
- Page 108 and 109:
case 1: pszReturnValue = "Янва
- Page 110 and 111:
Глава 10 Прочие функ
- Page 112 and 113:
накопление последо
- Page 114 and 115:
Создание модуля MainM
- Page 116 and 117:
7. Выберите пункт ме
- Page 118 and 119:
Глава 11 Отладка про
- Page 120 and 121:
: с: \wiNNT\System32\command.com -
- Page 122 and 123:
ошибка находится в
- Page 124 and 125:
Введите следующее
- Page 126 and 127:
Таблица 11.1. Команды
- Page 128 and 129:
мую команду. (Испол
- Page 130 and 131:
Теперь достоверно
- Page 132 and 133:
! f _cSfc/*№it*le E File Edit t 1
- Page 134 and 135:
void init(unsigneds accountNumber,
- Page 136 and 137:
Чтобы продемонстри
- Page 138 and 139:
Часть III "Классичес
- Page 140 and 141:
Глава 12 Знакомство
- Page 142 and 143:
Люди склонны заним
- Page 144 and 145:
После ключевого сл
- Page 146 and 147:
cin >> nds.firstName; if (stricmp(n
- Page 148 and 149:
Глава 14 Работа с кл
- Page 150 and 151:
Микроволновая печь
- Page 152 and 153:
Student s; void fn(void) { //это
- Page 154 and 155:
Объект, для которог
- Page 156 and 157:
добавляем новый ку
- Page 158 and 159:
}; float grade () ; //...прочи
- Page 160 and 161:
invariable; //объявление
- Page 162 and 163:
eturn 0; Теперь "ps вычи
- Page 164 and 165:
#include #include class Student {
- Page 166 and 167:
Возв[гшн к tct/че Про
- Page 168 and 169:
Другие операции на
- Page 170 and 171:
} // указывать на вст
- Page 172 and 173:
Глава 16 Защищенные
- Page 174 and 175:
} //повысим свой рей
- Page 176 and 177:
эта функция — друг
- Page 178 and 179:
Глава 17 Создание и
- Page 180 and 181:
Однако, как уже отм
- Page 182 and 183:
В одной строке може
- Page 184 and 185:
Работа с деструкто
- Page 186 and 187:
Глава 18 Аргументац
- Page 188 and 189:
int main(int argcs, char* pArgs[])
- Page 190 and 191:
} Student freshMan("Smell E. fish")
- Page 192 and 193:
Компилятор сообщае
- Page 194 and 195:
protected: int value class Student
- Page 196 and 197:
С точки зрения прив
- Page 198 and 199:
При отладке такой п
- Page 200 and 201:
Глава 19 Копирующий
- Page 202 and 203:
} cout
- Page 204 and 205:
Создаем нового сту
- Page 206 and 207:
Для решения указан
- Page 208 and 209:
} // временный объек
- Page 210 and 211:
Глава 20 Статически
- Page 212 and 213: noOfStudents++; //обращени
- Page 214 and 215: class Student { public: static int
- Page 216 and 217: Что такое this Я уже у
- Page 219 and 220: функция display — отоб
- Page 221 and 222: for (int j=0; j < noSvgAccounts; j-
- Page 223 and 224: Сумма по сберегате
- Page 225 and 226: В э*яой чаани... Из д
- Page 227 and 228: кода. Представьте с
- Page 229 and 230: public: int qualifier( > { return q
- Page 231 and 232: sor. Однако вы можете
- Page 233 and 234: int main (int argcs, char* pArgs[])
- Page 235 and 236: Зачем нужен полимо
- Page 237 and 238: #include class Base public: virtua
- Page 239 and 240: сначала выключить
- Page 241 and 242: Единственное отлич
- Page 243 and 244: к классу дополните
- Page 245 and 246: Checking I withdrawal!) 1 i — 1 d
- Page 247 and 248: унаследуют эти изм
- Page 249 and 250: Концепция абстракт
- Page 251 and 252: virtual void write(char *pString);
- Page 253 and 254: pAcc->withdrawal(100.OOf); //это
- Page 255 and 256: BUDGET3.CPP — Программа
- Page 257 and 258: Account* next() } return (Account*)
- Page 259 and 260: if (++noWithdrawals > 1) { balance
- Page 261: Введите номер счет
- Page 265 and 266: в э&ой чхшпи... В это
- Page 267 and 268: Я осознаю, что это с
- Page 269 and 270: int main(int argcs, char* pArgs[ US
- Page 271 and 272: } return si; Проблема в т
- Page 273 and 274: Oneficwiofibi как функции
- Page 275 and 276: ...тело функции здес
- Page 277 and 278: Распространенная о
- Page 279 and 280: Если потребуется в
- Page 281 and 282: Копирующий констру
- Page 283 and 284: Класс Name содержит р
- Page 285 and 286: оператор присвоени
- Page 287 and 288: Время вводить новы
- Page 289 and 290: Первый аргумент эт
- Page 291 and 292: Функция открывает
- Page 293 and 294: i cout
- Page 295 and 296: Написание сода&вен
- Page 297 and 298: Заметьте, что эта ф
- Page 299 and 300: редается объект uSDol
- Page 301 and 302: try { // Эта строка ген
- Page 303 and 304: управление перелае
- Page 305 and 306: filetsizeof file - 1] = 'NO'; lineN
- Page 307 and 308: Глава 28 Множествен
- Page 309 and 310: Ответ прост: оба. Кл
- Page 311 and 312: М-да... "Не говори "го
- Page 313 and 314:
void fn() SleeperSofa ss; cout « "
- Page 315 and 316:
Указатели рВ1 и рВ2
- Page 317 and 318:
S э&ой чаани,.. Ни одн
- Page 319 and 320:
Умный компилятор (т
- Page 321 and 322:
МомменйифциЖе свою
- Page 323 and 324:
Приложение А Слова
- Page 325 and 326:
Полиморфизм Порожд
- Page 328 and 329:
цказсиОель --, 36; 42 !,
- Page 330 and 331:
Оператор присвоени
- Page 332 and 333:
ПРОГРАММИРОВАНИЯ Д
- Page 334 and 335:
»лия ПОЛЬЗОВАТЕЛЯ
- Page 336 and 337:
ерия компьютерных