Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы.
Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса по умолчанию.
Деструкторы также не наследуются, и если программист не описал в производном классе деструктор, он формируется по умолчанию.
Остальные методы могут наследоваться или переопределяться.
Поля, унаследованные из родительского класса, и которые определены в базовом классе как 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;