Разделение программы - класс GraduateStudent...262

Следующий модуль, представляющийся квазинезависимым, — GraduateStudent. Он может быть помещён в файл Student.срр, однако ряд программ могут работать только со студентами, даже не подозревая о наличии аспирантов.

Класс GraduateStudent сделан мною максимально простым. Вот как выглядит заголовочный файл.

    /* GraduateStudent — специальный тип Student */

    #ifndef _GRADUATE_STUDENT_

    #define _GRADUATE_STUDENT_

    #include "student.h"

    namespace Schools

    {

        class GraduateStudent : public Student

        {

          public :

            /* Тривиальный конструктор */

            GraduateStudent( char* pszName , int nID )

                         : Student( pszName , nID ){ }

            /* Демонстрация виртуальной функции */

            virtual char* display( ) ;

        } ;

    }

    #endif

Обратите внимание, что файл GraduateStudent.h включает файл Student.h. Это связано с тем, что класс GraduateStudent зависит от определения класса Student. Файл с исходным кодом содержит реализацию метода display( ).

    /* GraduateStudent — специальный тип Student */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    #include <string.h>

    #include "graduateStudent.h"

    namespace Schools

    {

        char* GraduateStudent::display( )

        {

            /* Описание студента */

            char* pFirst = Student::display( ) ;

            /* Добавляем этот текст */

            char* pSecond = "-G" ;

            /* Выделяем память для новой строки и создаём её */

            char* pName = new char[ strlen( pFirst ) +

                                  strlen( pSecond ) + 1 ] ;

            strcpy( pName , pFirst ) ;

            strcat( pName , pSecond ) ;

            /* Освобождаем память, которую вернул вызов Student::display( ) */

            delete pFirst ;

            return pName ;

        }

    }

_________________

262 стр. Часть 4. Наследование

Функция display( ) из класса GraduateStudent добавляет "-G" к строке, возвращаемой функцией display( ) из класса Student. Она начинает свою работу с того, что выделяет память из кучи для новой строки.

«Никогда не надо полагаться на то, что в исходном буфере имеется достаточно места для дополнительных символов, дописываемых в конец строки.»

[Атас!]

Программа копирует в новый буфер полученную от функции display( ) из класса Student строку, добавляет к ней "-G" и освобождает память, которую занимала исходная строка.

«Забыв освободить память, выделенную в куче, вы получите эффект, именуемый утечкой памяти. Программа с утечкой памяти поначалу работает вполне корректно, но со временем всё большее и большее количество памяти оказывается потерянным, что может привести к неработоспособности программы из-за отсутствия памяти. Обычно утечки памяти очень трудно обнаружить.»

[Атас!]