|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Наследование. Понятие наследования. Базовый и производные (порожденный) классы. Синтаксис определения производного класса. Подстановка конструкторов и методов базового классаНаиболее значимой после классов возможностью ООП является наследование. Это процесс создания новых классов, называемых наследниками или производными классами, из уже существующих или базовых классов. Производный класс получает все возможности базового класса, но может также быть усовершенствован за счет добавления собственных. Базовый класс при этом остается неизменным. Если стрелка показывает вниз, то это называется наследованием. Однако обычно она указывает вверх, от произвольного класса к базовому, и называется производный от. Выигрыш от него состоит в том, что наследование позволяет использовать существующий код несколько раз. Имея написанный и отлаженный базовый класс, мы можем его больше не модифицировать, при этом механизм наследования позволит нам приспособить его для работы в различных ситуациях. Используя уже написанный код, мы экономим время и деньги, а также увеличиваем надежность программы. Наследование может помочь и при начальной постановке задачи программирования, разработке общей структуры программы. Важным результатом повторного использования кода является упрощение распространения библиотек классов. Программист может использовать классы, созданные кем-то другим, без модификации кода, просто создавая производные классы, подходящие для частной ситуации. Базовый и производный классы #include <iostream.h> using namespace std; class Counter //базовый класс { protected: unsigned int count; //счетчик public: Counter (): count (0) //конструктор без аргументов { } Counter (int c): count (c) { } unsigned int get_count () const { return count; } // возвращает значение счетчика Counter operator++ () //увеличивает значение //счетчика (префикс) { return Counter (++count); } }; class CountDn: public Counter//производный класс { public: Counter operator-- () //уменьшает значение счетчика { return Counter (--count); } }; int main () { CountDn c1; // объект c1 cout << "\n c1=" << c1.get_count (); //вывод на печать ++c1; ++c1; ++c1; //увеличиваем c1 три раза cout << "\n c1=" << c1.get_count (); //вывод на печать --c1; --c1; //уменьшаем c1 два раза cout << "\n c1=" << c1.get_count (); //вывод на печать cout << endl; return 0; } Программа начинается с описания класса Count, которое не изменилось с момента его первого появления. Определение производного класса Вслед за описанием класса Count в программе определен новый класс, CountDn. Он включает в себя новый метод operator--(), который уменьшает счетчик. В то же время CountDn наследует все возможности класса Counter: конструктор и методы. В первой строке описания класса CountDn указывается, что он является производным классом от Counter. class CountDn: public Counter Для этого используется знак двоеточия, за ним следует ключевое слово public и имя базового класса Counter. Таким образом, мы установили отношение между классами. Другими словами, эта стркка говорит нам о том, что CountDn является наследником класса Counter. Подстановка конструкторов базового класса Создадим объект класса CountDn в функции main(); CountDn c1; Эта строка означает, что c1 будет создан как объект класса CountDn и инициализирован нулем. Но в классе CountDn нет конструктора, каким же образом выполняется инициализация? Оказывается, что если мы не определили конструктор производного класса, то будет использоваться подходящий конструктор базового класса. Конструктор класса CountDn отсутствует, и компилятор использует конструктор класса Counter без аргументов. Такая гибкость компилятора — использование доступного метода взамен отсутствующего — обычная ситуация, возникающая при наследовании. Подстановка методов базового класса Объект c1 класса CountDn также может использовать методы operator++() и get_ count() из базового класса. Сначала используем увеличение c1: ++c1; Затем выведем на экран значение счетчика c1: cout << "\n c1 = " << c1.get_count (); Вновь компилятор, не найдя этих методов в классе, объектом которого является c1, использует методы базового класса.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |