Конструирование подкласса...237

We use cookies. Read the Privacy and Cookie Policy

Хотя подкласс и имеет доступ к защищённым членам базового класса, а значит, может инициализировать их, было бы хорошо, если бы базовый класс всё же конструировал сам себя. В действительности так и происходит.

Перед тем как управление получает код, стоящий за открывающей фигурной скобкой класса GraduateStudent, оно передаётся конструктору по умолчанию класса Student ( поскольку другой конструктор не был указан ). Если бы класс Student был наследником другого класса, например Person, то конструктор этого класса вызывался бы до передачи управления конструктору Student. Подобно небоскребу, объект строится, начиная с "фундаментального" уровня в соответствии со структурой наследования классов и вызывая конструкторы всех классов, составляющих данный.

Как и в случае с объектами-членами, вам может понадобиться передавать аргументы конструктору базового класса. Это делается почти так же, как и изученная ранее передача аргументов конструктору объекта-члена ( смотрите приведённый ниже пример ).

    GraduateStudent( char *pName , Advisor&adv , float qG=0.0 )

        :Student( pName ) , advisor( adv ) , qualifierGrade(qG)

    {

        /* Код конструктора */

    }

В этом примере конструктор класса GraduateStudent вызывает конструктор Student, передавая ему аргумент pName. Базовый класс конструируется до любых объектов-членов, а значит, конструктор класса Student вызывается перед конструктором Advisor. И только после конструктора члена Advisor начинает работу конструктор GraduateStudent.

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

    class Pig

    {

    public :

        Pig( ) : pHouse( 0 ) { }

    protected :

        House* pHouse ;

    } ;

    class LittlePig : public Pig

    {

    public :

        LittlePig( float volStraw , int numSticks , int numBricks )

            : straw( volStraw ) , sticks( numSticks ) , bricks( numBricks )

        { }

    protected :

        float straw ;

        int sticks ;

        int bricks ;

    } ;

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

_________________

237 стр. Глава 20. Наследование классов