Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание программ на С++.doc
Скачиваний:
15
Добавлен:
29.09.2019
Размер:
1.59 Mб
Скачать

Второй пример

Предположим, например, что вы используете следующий базовый класс book внутри существующей программы:

class book

{  public:     book (char *, char *, int);     void show_book(void);  private:     char title[64];     char author[б 4];     int pages;  };

Далее предположим, что программе требуется создать класс library_card, который будет добавлять следующие элементы данных в класс book:

char catalog[64];  int checked_out; // 1, если проверена, иначе О

Ваша программа может использовать наследование, чтобы породить класс library _card из класса book, как показано ниже:

class library_card : public book

{  public:     library_card(char *, char *, int, char *, int);     void show_card(void);  private:     char catalog[64] ;     int checked_out;  };

Следующая программа BOOKCARD.CPP порождает класс library_card из клacca book:

#include <iostream.h>

#include <string.h>

class book

{  public:     book(char *, char *, int);     void show_book(void);  private:     char title [64];     char author[64];     int pages;  };

book::book(char •title, char *author, int pages)

{     strcpy(book::title, title);     strcpy(book::author, author);     book::pages = pages;  }

void book::show_book(void)

{     cout << "Название: " << title << endl;     cout << "Автор: " << author << endl;     cout << "Страниц: " << pages << endl;  }

class library_card : public book

{  public:     library_card(char *, char *, int, char *, int);     void show_card(void) ;  private:     char catalog[64];     int checked_out;  };

library_card::library_card(char *title, char *author, int pages, char *catalog, int checked_out) : book(title, author, pages)

{     strcpy(library_card::catalog, catalog) ;     library_card::checked_out = checked_out;  }

void 1ibrary_card::show_card(void)

{     show_book() ;     cout << "Каталог: " << catalog << endl;     if (checked_out) cout << "Статус: проверена" << endl;     else cout << "Статус: свободна" << endl;  }

void main(void)

{     library_card card( "Учимся программировать на языке C++", "Jamsa", 272, "101СРР", 1);     card.show_card();  }

Как и ранее, обратите внимание, что конструктор library _card вызывает конструктор класса book для инициализации элементов класса book. Кроме того, обратите внимание на использование функции-элемента show_book класса book внутри функции show_card. Поскольку класс library_card наследует методы класса book, функция show_card может вызвать этот метод (show_book) без помощи оператора точки, как если бы этот метод был методом класса library _card.

Что такое защищенные элементы

При изучении определений базовых классов вы можете встретить элементы, объявленные как public, private и protected (общие, частные и защищенные). Как вы знаете, производный класс может обращаться к общим элементам базового класса, как будто они определены в производном классе. С другой стороны, производный класс не может обращаться к частным элементам базового класса напрямую. Вместо этого для обращения к таким элементам производный класс должен использовать интерфейсные функции. Защищенные элементы базового класса занимают промежуточное положение между частными и общими. Если элемент является защищенным, объекты производного класса могут обращаться к нему, как будто он является общим. Для оставшейся части вашей программы защищенные элементы являются как бы частными. Единственный способ, с помощью которого ваши программы могут обращаться к защищенным элементам, состоит в использовании интерфейсных функций. Следующее определение класса book использует метку protected, чтобы позволить классам, производным от класса book, обращаться к элементам title, author и pages напрямую, используя оператор точку:

class book

{  public:     book(char *, char *, int) ;     void show_book(void) ;  protected:     char title [64];     char author[64];     int pages;  };

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

Защищенные элементы обеспечивают доступ и защиту

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