МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
Просте спадкуванняПростим називається спадкування, при якому похідний клас має одного батька. Для різних методів класу існують різні правила спадкування — наприклад, конструктори й операція присвоювання в похідному класі не успадковуються, а деструктори успадковуються. Розглянемо спадкування класів і проблеми, що виникають при цьому, на прикладі. Створимо похідний від класу monstr клас daemon, додавши корисну в деяких випадках здатність думати. enum color {red, green, blue}; // Клас monstr class monstr{ // Сховані поля класу: int health, ammo; color skin; char *name; public: // Конструктори: monstr (int he = 100, int am = 10); monstr(color sk); monstr(char* nam); monstr(monstr &M); // Деструктор: ~monstr() {delete [] name:} monstr &operator ++(){++health; return *this;} monstr operator ++(int){monstr M(*this); health++; return M; } operator int(){return health;} bool operator >(monstr &M){if( health > M.health) return true; return false;} const monstr &operator = (monstr &M){if (&M == this) return *this; if (name) delete [] name; if (M.name){name = new char [strlen(M.name) +1]; strcpy(name, M.name);} else name = 0; health = M.health; ammo = M.ammo; skin = M.skin; return *this; // Методи доступу до полів: int get_health() const {return health;} int get_ammo() const {return ammo;} // Методи, що змінюють значення полів: void change_health(int he){ health = he;} // Інші методи: void draw(int x, int y, int scale, int position): }; // Реалізація класу monstr monstr::monstr(int he, int am); health (he), ammo (am), skin (red), name (0){} monstr::monstr(monstr &M){ if (M.name){ name = new char [strlen(M.name) + 1]; strcpy(name. M.name);} else name =0; health - M.health; ammo = M.ammo; skin = M.skin; } monstr::monstr(color sk){ switch (sk){ case red: health = 100; ammo = 10; skin = red; name = 0; break; case green: health = 100; ammo = 20; skin = green; name = 0; break; case blue: health = 100; ammo = 40; skin = blue: name = 0: break; } } monstr::monstr(char *nam){ name = new char [strlen(nam) + 1]; strcpy(name, nam); health - 100; ammo =10: skin = red; } void monstr::draw(int x, int y, int scale, int position) { /* Отрисовка monstr */ } // Клас daemon class daemon : public monstr{ int brain; public: // Конструктори: daemon(int br = 10){brain = br;}; daemon(color sk) : monstr (sk) {brain =10;} daemon(char *nam) : monstr (nam) {brain = 10;} daemon(daemon &M) : monstr (M) {brain - M.brain;} // Операції: const daemon &operator = (daemon &M){ if (&M == this) return *this; brain = M.brain; monstr::operator = (M); return *this; } // Методи, що змінюють значення полів: void think; // Інші методи: void draw(int x, int у, int scale, int position); }; // Реалізація класу daemon void daemon :: think(){ /* ... */ } void daemon :: draw(int x, int y, int scale, int position) {/* Малювання daemon */} * У класі daemon введене поле brain та метод think, визначені власні конструктори й операція присвоювання, а також перевизначений метод малювання draw. Всі поля класу monstr, операції (крім присвоювання) і методи getheal th, get_aramo і change_health успадковуються в класі daemon, а деструктор формується за замовчуванням. Розглянемо правила спадкування різних методів. Конструктори не успадковуються, тому похідний клас повинний мати власні конструктори. Порядок виклику конструкторів визначається приведеними нижче правилами.
Не успадковується й операція присвоювання, тому її також потрібно явно визначити в класі daemon. Зверніть увагу на запис функції-операції: у її тілі застосований явний виклик функції-операції присвоювання з базового класу. Щоб краще уявити собі синтаксис виклику, ключове слово operator разом зі знаком операції можна інтерпретувати як ім'я функції-операції. Виклик функцій базового класу переважніше копіювання фрагментів коду із функцій базового класу в функції похідного. Крім скорочення обсягу коду, цим досягається спрощення модифікації програми: зміни потрібно вносити тільки в одне місце програми, що скорочує кількість можливих помилок. Нижче перераховані правила спадкування деструкторів.
Поля, успадковані із класу monstr, недоступні функціям похідного класу, оскільки вони визначені в базовому класі як private. Якщо функціям, визначеним в daemon, потрібно працювати з цими полями, можна або описати їх у базовому класі як protected, або звертатися до них за допомогою функцій із monstr, або явно перевизначити їх у daemon так, як було показано в попередньому вище. Розглядаючи спадкування методів, зверніть увагу на те, що в класі daemon описан метод draw, що перевизначає метод з тим же ім'ям у класі monstr (оскільки "малювання" різних персонажів, природно, виконується по-різному). Таким чином, похідний клас може не тільки доповнювати, але і коректувати поводження базового класу1. Доступ до перевизначеного методу базового класу для похідного класу виконується через ім'я, уточнене за допомогою операції доступу до області видимості (::).
|
||||||||
|