АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы

Читайте также:
  1. Biglnteger Классы
  2. FIRM-карта классификации рисков
  3. I. КЛАССИЧЕСКАЯ МЕХАНИКА
  4. II.2. Классическая греческая философия.
  5. II.8. Немецкая классическая философия.
  6. III Классический отрезок
  7. IV класс.
  8. IV. ПРИСВОЕНИЕ КВАЛИФИКАЦИОННОГО РАЗРЯДА, КЛАССНОГО ЧИНА, ДИПЛОМАТИЧЕСКОГО РАНГА, ВОИНСКОГО ЗВАНИЯ
  9. IX.4. Классификация наук
  10. MxA классификация
  11. Object классы
  12. V2: Классическая философия - 1

Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса по умолчанию.

Деструкторы также не наследуются, и если программист не описал в производном классе деструктор, он формируется по умолчанию.

Остальные методы могут наследоваться или переопределяться.

Поля, унаследованные из родительского класса, и которые определены в базовом классе как 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--; }

};

Так как действия в конструкторах базового и производного классов совпадают, то мы подключаем вызов конструкторов базового класса, для выполнения нужных действий.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)