C++ Программирование в среде С++ Builder 5

         

Конструкторы, деструкторы и наследование


Конструкторы не наследуются. Это утверждение требует некоторых пояснений. Оно означает, что если в базовом классе имеются конструктор с некоторыми параметрами, он не будет вызываться автоматически, если вы . попробуете создать объект производного класса с такими параметрами. Для этого нужно написать конструктор производного класса, в котором конструктор базового класса будет вызываться через посредство списка инициализации. О нем мы уже говорили выше в связи с инициализацией элементов данных класса. Базовые классы в смысле инициализации ничем от них не отличаются.

Если в списке инициализации конструктора отсутствует вызов какого бы то ни было конструктора базового класса, компилятор все равно вызовет для последнего конструктор по умолчанию, т. е. конструктор без параметров. В примере предыдущего параграфа объявлен конструктор базового класса, который может вызываться без параметров, поскольку для него определены аргументы по умолчанию. Если вы не поленитесь пройти по этому примеру в отладчике, то увидите последовательность вызовов при создании объекта производного класса в функции main () .

Однако базовый конструктор можно вызвать явно через список инициализации. Класс из предыдущего параграфа нужно модифицировать примерно так:

class Alarm: public Time { // Класс сообщений таймера.

char *msg;

public:

Alarm(char*);

Alarmfchar*, int, int); // Новый конструктор.

~Alarm() { delete[] msg; }

void SetMsg(char*) ;

void Show(); // Переопределяет Time:: Show ().

//. . .

Alarm::Alarm(char *str, int h, int m): Time(h, m) {

msg = new char[strlen(str) + 1];

strcpy(msg, str);

}

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



Содержание раздела