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

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

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

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

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

};

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








Дата добавления: 2015-02-10; просмотров: 1013;


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

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.