
Лекция 5 |
Простое наследование |
6 |
Использование конструктора с параметрами
Рассмотрим теперь, как строится конструктор производного класса, предоставляемый программистом. Поскольку производный класс должен унаследовать все члены родительского, при построении объекта своего класса он должен обеспечить инициализацию унаследованных данных-членов.
Данные-члены производного класса могут использовать значения данных-членов родительского класса. Поэтому инициализацию унаследованных данных-членов класса должна быть выполнена до инициализации данных-членов производного класса. Конструктор производного класса строится с использованием следующего синтаксиса:
<констр_произв_класса> ( <список_параметров> ) : <констр_базового_класса> ( <список_аргументов> ) { <тело_конструктора> }
Здесь используется список инициализации элементов, в котором указывается конструктор базового класса. Часть параметров, переданных конструктору производного класса, обычно используется в качестве аргументов конструктора базового класса. Затем в теле конструктора производного класса выполняется инициализация данных-членов, принадлежащих собственно этому классу.
Первый конструктор класса Dot имеет вид:
Dot ( char Name ) : Coord ( ) { name = Name ; }
При вызове этого конструктора сначала вызывается конструктор базового класса Coord ( ), который инициализирует унаследованные данные-члены x и y нулями. Затем в теле конструктора данное-член name инициализируется значением параметра конструктора Name.
Второй конструктор класса Dot имеет вид:
Dot ( char Name , double X , double Y ) : Coord ( X , Y ) { name = Name ; }
При вызове второго конструктора сначала вызывается конструктор базового класса Coord ( double X, double Y ), который инициализирует унаследованные данные-члены x и y значениями параметров конструктора X и Y. Затем в теле конструктора данное-член name инициализируется значением параметра конструктора Name.
Переопределение и вызов членов базового класса
В производном классе обычно добавляются новые члены к членам базового класса. Однако существует также возможность переопределения (или замещения) членов базового класса. Обычно используется переопределение функций-членов базового класса. Чтобы переопределить функцию-член базового класса в производном классе, достаточно включить ее прототип в объявление этого класса и затем дать ее определение. Прототипы переопределяемой функции в базовом и производном классах должны совпадать.
Иногда возникает необходимость вызвать функцию-член базового класса, а не ее переопределенный вариант, это можно сделать с помощью операции разрешения области видимости, применяемой в форме:
<имя_класса> :: <имя_члена>
Это дает возможность компилятору "видеть" за пределами текущей области видимости. Особенно часто это приходится делать при переопределении функций-членов. Переопределяемая функция-член может вызывать соответствующую функцию-член базового класса, а затем выполнять некоторую дополнительную работу (или наоборот).
В приведённом выше классе Dot была переопределена функция Print ( ). Тело функции содержит операторы, которые выводят на экран заголовок “Координаты точки ” и имя точки. Далее вызывается функция Print ( ), которая является членом родительского класса Coord, с помощью оператора:
Coord :: Print ( ) ;
Член родительского класса Coord функция Print ( ) выводит на экран в той же строке координаты точки. В результате на экране появится, например, следующий текст:
Координаты точки A : |
x = 4 |
y = 5 |
Выжол Ю.А. |
Объектно-ориентированное программирование |