Программирование >>  Программирование на языке c++ 

1 ... 43 44 45 [ 46 ] 47 48 49 ... 159


рые дополнительные операции. Опять же П::Р лучше, чем Б::Р;

3) использовать функцию B::F без изменения;

если объявить указатель рБ на базовый класс, то ему можно присвоить значение указателя на объект производного класса, однако обратное утверждение неверно (см. следующий пункт);

указателю рП на производный класс нельзя присвоить значение указателя на объект базового класса;

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

регулирование доступа к компонентам базового и производного классов осуществляется с помощью атрибутов private, public и protected (см. § 4.6);

производный класс может быть в свою очередь базовым. Множество классов, связанных отношением наследования базовый - производный, называется иерархией классов.

4.2. Конструкторы и деструкторы

Некоторые производные классы должны иметь конструкторы. Если базовый класс имеет конструктор, то этот конструктор должен быть вызван при построении производного класса. Если конструктор имеет аргументы, то значения этих аргументов должны быть переданы в конструктор. Значения, которые надо передать в конструктор базового класса, можно задать в виде параметров конструктору соответствующего производного класса. Рассмотрим пример:

class book { char* title; char* language; int price;

int publishing year; public:



book(char* book title, int book publishing year);

..................... };

Здесь при описании книги мы хотим указать ее название (book title) и год опубликования (book publishing year). Предположим, цена книги может изменяться и книга может быть переведена на другой язык. Поэтому соответствующие параметры для конструктора задавать не будем.

Рассмотрим теперь производный класс programmers guide. Предположим, что для конструктора этого класса нужен только один параметр, который задаст используемый язык программирования (programming language used). Однако при вызове конструктора производного класса необходимо вызвать соответствующий конструктор базового класса, чтобы сконструировать (инициализировать) компоненты базового объекта, которые, возможно, будут использованы производным объектом. Тогда конструктор производного класса будет иметь уже не один, а три параметра и наш пример может быть продолжен, например, в следующем виде:

class programmers guide : public book { int level;

char* programming language used; public;

programmers guide(char* book title,

char* language, int book publishing year);

..................... };

programmers guide:; programmers guide(char* book title, char* language, int book publishing year) : book(book title, book publishing year), programming language used(language) { } При этом конструктор базового класса может выглядеть так: book:: book(char* book title, int book publishing year) : title(book title), publishing year(book pubiishing year)

{ }

В примере объекты конструируются в следующем порядке: сначала объект базового класса book, потом компонент programming language used, затем объект производного класса. Сконструированные объекты разрушаются в обратном



порядке, т. е. сначала объект производного класса, потом компонент и, наконец, объект базового класса. Другими словами, базовые объекты и компоненты конструируются в порядке их объявления и разрушаются в обратном порядке.

Рассмотрим примеры. Первая программа демонстрирует последовательность вызова конструкторов и деструкторов для трехуровневой иерархической структуры классов вида: А<-В<-С.

#include <iostream.h>

struct А{ базовый класс

А() { cout << А CON\n ; } конструктор ~А() { cout А DES\n ; } деструктор

struct В : public А { производный и он же базовый класс В() { cout В CON\n ; } конструктор В() { cout В DES\n ; } деструктор

class С : public В { производный класс

public:

С() { cout С CON\n ; } конструктор ~С() { cout С DES\n ; } деструктор

void f() { произвольная функция

А аа; объявление объекта аа класса А В bb; объявление объекта bb класса В С сс; } объявление объекта сс класса С

void main(void)

{ f(); } вызов функции f

Результаты работы программы представятся в виде:

А CON

А CON

В CON

А CON

В CON

С CON

С DES



1 ... 43 44 45 [ 46 ] 47 48 49 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика