|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторыЕсли в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса по умолчанию. Деструкторы также не наследуются, и если программист не описал в производном классе деструктор, он формируется по умолчанию. Остальные методы могут наследоваться или переопределяться. Поля, унаследованные из родительского класса, и которые определены в базовом классе как private, недоступны функциям производного класса. Если они должны использоваться функциям, определенным в производном классе, можно либо описать их в базовом классе как protected, либо явно переопределить их в производном классе. Вернемся к примеру счетчиков. Предположим, что нам понадобился метод, уменьшающий значение счетчика. Разработаем новый класс CountDown. class Counter { protected: int count; public: Counter ():count(0){ } Counter(int c): count(c){ } void inc_count () {count++; } int get_count() { return count; } }; class CountDown: public Counter { public: void dec_count () {count--; } }; Новый класс наследует: поле count и методы get_count() и inc_count(). int main(int argc, char *argv[]) { Counter c1, c2(3); CountDown c3; std::cout<<c1.get_count()<<std::endl; std::cout<<c2.get_count()<<std::endl; std::cout<<c3.get_count()<<std::endl; c1.inc_count(); c2.inc_count(); c3.dec_count(); std::cout<<c1.get_count()<<std::endl; std::cout<<c2.get_count()<<std::endl; std::cout<<c3.get_count()<<std::endl; return 0; } Для объекта c3 доступен новый метод: c3.dec_count(); Но можно применять и унаследованные методы, например:std::cout<<c3.get_count()<<std::endl; Можно добавить в программу еще две строчки: c3.inc_count(); std::cout<<"!!!"<<c3.get_count()<<std::endl; Тогда значение счетчика с3 увеличится! Переменная с3 – это объект класса CountDown. В классе CountDown нет конструктора. Если в производном классе не определен конструктор, то используется конструктор базового класса без параметров. Но мы не сможем воспользоваться конструктором с параметром из базового класса. Поэтому, если возникает необходимость инициализации объекта с3 каким-либо другим значением, мы должны написать новый конструктор: class CountDown: public Counter //определение класса { public: CountDown ():Counter(0){ } CountDown(int c): Counter(c){ } void dec_count () {count--; } }; Так как действия в конструкторах базового и производного классов совпадают, то мы подключаем вызов конструкторов базового класса, для выполнения нужных действий. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |