10239

Наследование и защищенные элементы класса

Лекция

Информатика, кибернетика и программирование

Лекция 13. Наследование и защищенные элементы класса. 13.1. Наследование. Цель объектно-ориентированного программирования состоит в повторном использовании созданных классов. Если уже создан некоторый класс то возможны ситуации что новому классу нужны многие

Русский

2013-03-24

79.5 KB

3 чел.

Лекция 13. Наследование и защищенные элементы класса.

   13.1. Наследование.

  Цель объектно-ориентированного программирования состоит в повторном использовании созданных классов. Если уже создан некоторый класс, то возможны ситуации, что новому классу нужны многие особенности уже существующего класса, и необходимо добавить один или несколько элементов данных или функций. C++ позволяет строить новый объект, используя характеристики уже существующего объекта. Новый объект будет наследовать элементы существующего класса (называемого базовым классом). Когда строится новый класс из существующего, этот новый класс называется производным классом.
  В дополнение к общим (
public) (доступным всем) и частным (private) (доступным методам класса) элементам C++ предоставляет защищенные (protected) элементы, которые доступны базовому и производному классам.
  
Наследование представляет собой способность производного класса наследовать характеристики существующего базового класса. Предположим, что есть базовый класс employee:

  class employee

   {

   public:

      employee(char *, char *, float);

      void show_employee(void);

   private:

      char name[64];

      char position[64];

      float salary;

   }; 

  Предположим, что программе требуется класс manager, который добавляет следующие элементы данных в класс employee:
          float annual_bonus;
         char company_car[64];
         int stock_options;


  Программа может выбрать два варианта:

- создать новый класс manager, который дублирует многие элементы класса employee,

- породить класс типа manager из базового класса employee.

  Порождая класс manager из существующего класса employee, снижается объем требуемого программирования и исключается дублирование кода

внутри программы.

  Для определения этого класса необходимо указать ключевое слово
class, имя manager, следующее за ним двоеточие и имя employee:
        class manager:public employee

           {

                 определяются элементы
            };
  Ключевое слово public, которое предваряет имя класса employee, указывает, что общие (public) элементы класса employee также являются общими и в классе manager. Следующие операторы порождают класс manager.
       class manager : public employee
         {
           public:
             manager(char *, char *, char *, float, float, int);
             void show_manager(void);
         private:
            float annual_bonus;
           char company_car[64];
          int stock_options;
        };

  Когда порождается класс из базового класса, частные элементы базового класса доступны производному классу только через интерфейсные функции базового класса. Таким образом, производный класс не может напрямую обратиться к частным элементам базового класса, используя оператор точку.
  Следующая программа использует наследования в C++ , создавая класс
manager из базового класса employee:

 Primer 1 Лекция 13.

#include <iostream>

#include <string.h>

using namespace std;

  class employee

  {

  public:

     employee(char *, char *, float);

     void show_employee(void);

  private:

     char name [ 64 ];

     char position[64];

     float salary;

  };

  employee::employee(char *name, char *position,float salary)

  {

     strcpy(employee::name, name);

     strcpy(employee::position, position);

     employee::salary = salary;

  }

  void employee::show_employee(void)

  {

     cout << "Имя: " << name << endl;

     cout << "Должность: " << position << endl;

     cout << "Оклад: $" << salary << endl;

  }

  class manager : public employee

  {

  public:

     manager(char *, char *, char *, float, float, int);

     void show_manager(void);

  private:

     float annual_bonus;

     char company_car[64];

     int stock_options;

  };

  manager::manager(char *name, char *position, char *company_car, float salary, float bonus, int stock_options) : employee(name, position, salary)

  {

     strcpy(manager::company_car, company_car);

     manager::annual_bonus = bonus;

     manager::stock_options = stock_options;

  }

  void manager::show_manager(void)

  {

     show_employee();

     cout << "Машина фирмы: " << company_car << endl;

     cout << "Ежегодная премия: $" << annual_bonus << endl;

     cout << "Фондовый опцион: " << stock_options << endl;

  }

  int main()

  {   

     system("chcp 1251");

     employee worker("Савин", "Программист", 35000);

     manager boss("Нагель", "Вице-президент", "Ford", 50000.0, 5000, 1000);

     worker.show_employee();

     boss.show_manager();

     system("pause");

  }

  Программа определяет базовый класс employee,  затем определяет производный класс manager. Обратите внимание на конструктор manager. Когда порождается класс из базового класса, конструктор производного класса должен вызвать конструктор базового класса. Чтобы вызвать конструктор базового класса, необходимо поместить двоеточие после конструктора производного класса, а затем указать имя конструктора базового класса с требуемыми параметрами:

manager::manager(char *name, char *position, char *company_car, float salary, float bonus, int stock_options) :

   employee(name, position, salary)  // Конструктор базового класса

   {

   strcpy(manager::company_car, company_car);

   manager::annual_bonus = bonus;

   manager::stock_options = stock_options;

   }

  Функция show_manager вызывает функцию show_employee, которая является элементом класса employee. Поскольку класс manager является производным класса employee, класс manager может обращаться к общим элементам класса employee, как если бы все эти элементы были определены

внутри класса manager.
  Наследование представляет собой способность производного класса наследовать характеристики существующего базового класса. Если есть класс, чьи элементы данных или функции-элементы могут быть использованы новым классом, можно  построить новый класс в терминах существующего (базового) класса. Новый класс будет наследовать элементы (характеристики) существующего класса. Использование наследования для построения новых классов сэкономит значительное время. Объектно-ориентированное программирование широко использует наследование, позволяя программе строить сложные объекты из небольших легко управляемых объектов.
  Предположим, что используется базовый класс
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, если проверена, иначе 0

  Программа может использовать наследование, чтобы породить класс 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;

       }

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

Primer 1 Лекция 13.

#include <iostream>

#include <string.h>

using namespace std;

  class book

  {

  public:

     book(char *, char *, int);

     int show_book();

  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;

   }

  int book::show_book()

  {

     cout << "Название: " << title << endl;

     cout << "Автор: " << author << endl;

     cout << "Страниц: " << pages << endl;

  }

  class library_card : public book

  {

  public:

     library_card(char *, char *, int, char *, int);

     int show_card();

  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;

  }

  int library_card::show_card()

  {

     show_book();

     cout << "Каталог: " << catalog << endl;

     if (checked_out) cout << "Статус: проверена" << endl;

     else cout << "Статус: свободна" << endl;

   }

   int main()

  {   

     system("chcp 1251");

     library_card card( "C++", "Подбельский", 272, "101СРР", 1);

     card.show_card();

     system("pause");

  }

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

   13.2. Защищенные элементы.

  При изучении определений базовых классов можно встретить элементы, объявленные как 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;

};

  Если предполагается, что через некоторое время придется породить новые классы из создаваемого класса, установите, должны ли будущие производные классы напрямую обращаться к определенным элементам создаваемого класса, и объявите такие элементы защищенными, а не частными.
  Производный класс может обращаться
к защищенным элементам базового класса напрямую, используя оператор точку. Однако оставшаяся часть программы может обращаться к защищенным элементам только с помощью интерфейсных функций этого класса. Таким образом, защищенные элементы класса находятся между общими (доступными всей программе) и частными (доступными только самому классу) элементами.
  Если порождается один класс из другого, возможны ситуации, когда имя элемента класса в производном классе является таким же, как имя элемента в базовом классе. Если возник такой конфликт, C++ всегда использует элементы производного класса внутри функций производного класса. Например, предположим, что классы book и library_card используют элемент price. В случае класса book элемент price соответствует продажной цене книги, например $22.95. В случае класса library'_card price может включать библиотечную скидку, например $18.50. Если в вашем исходном тексте не указано явно (с помощью оператора глобального разрешения), функции класса library_card будут использовать элементы производного класса {library_card). Если же функциям класса library_card необходимо обращаться к элементу price базового класса {book), они должны использовать имя класса book и оператор разрешения, например book::price. Предположим, что функции show_card необходимо вывести обе цены. Тогда она должна использовать следующие операторы:
 

cout << "Библиотечная цена: $" << price << endl;

cout << "Продажная цена: $" << book::price << endl; 

 Если в производном и базовом классе есть элементы с одинаковым именем, то внутри функций производного класса C++ будет использовать элементы производного класса. Если функциям производного класса необходимо обратиться к элементу базового класса, необходимо использовать оператор глобального разрешения:

                                base class:: member


 

А также другие работы, которые могут Вас заинтересовать

48431. Моніторинг довкілля. Опорні конспекти лекцій 144.8 KB
  Мониторинг как система оценивания и прогнозирования будущего состояния окружающей среды: Оптимальная программа наблюдений за состоянием ОС: В соответствии с обоснованными значениями ПДК оптимальная программа наблюдений предусматривает отслеживание таких загрязняющих веществ: в атмосферном воздухе: диоксида серы оксидов азота озона диоксида углерода пыли аэрозоля тяжелых металлов пестицидов бенза пирена; в атмосферных осадках: тяжелых металлов ДДТ бензапирена азота общее содержание фосфора общее содержание анионов и...
48432. Історія сучасного світу. Опорний конспект лекцій 997.64 KB
  13 серпня 1961 року з метою перешкодження масовій втечі жителів НДР у Західну Німеччину. 9 листопада 1989 року новий уряд НДР оголосив про безперешкодний перехід зі Східного Берліна в Західний і навпаки. Офіційний демонтаж відбувся у січні 1990 року але частина стіни була залишена як памятка подій. Правовий статус Співдружності визначений Вестмінстерським статутом 1931 року який було уточнено в 1947 р.
48433. Операційний менеджмент. Опорний конспект лекцій 2.58 MB
  Мета викладання дисципліни формування у студентів навиків розробки та удосконалення операційної системи підприємства вмінь ефективного управління галузевими операційними підсистемами як основи забезпечення стратегічних цілей організації; комплексу знань щодо базових принципів основних категорій сучасних концепцій теоретичних положень та практичних методів управління основною діяльністю підприємства. В результаті вивчення дисципліни студент повинен усвідомити що операційна система є однією з найважливіших складових будьякого...
48434. Оценка и контроль персонала 118.9 KB
  Оценка персонала – процесс определения эффективности деятельности сотрудников в ходе реализации задач организации, позволяющий получить информацию для принятия дальнейших управленческих решений.
48435. РИТОРИКА ЯК НАУКА І НАВЧАЛЬНА ДИСЦИПЛІНА. ПРЕДМЕТ РИТОРИКИ, ЇЇ ОСНОВНІ ПОНЯТТЯ, ЗАКОНИ 30.68 KB
  ПРЕДМЕТ РИТОРИКИ ЇЇ ОСНОВНІ ПОНЯТТЯ ЗАКОНИ План: Визначення риторики як науки і навчальної дисципліни. Мета курсу красномовства предмет риторики. Модуси публічного виступу основні поняття риторики. Етапи розвитку риторики.
48437. Политология в системе наук об обществе 41.71 KB
  Обобщая различные характеристики можно констатировать что политика это деятельность в сфере отношений между большими социальными группами классами нациями государствами по поводу обретения организации использования политической власти и управления социальными процессами в интересах реализации их общественнозначимых запросов и потребностей. Из этого определения вытекает и структура политики основными компонентами которой являются: политический интерес представляющий собой внутренний осознанный источник политического поведения...
48438. Найдавніші часи. Початки людської цивілізації на території України 723.91 KB
  Початки людської цивілізації на території України Історія України це наука що вивчає розвиток людського суспільства на території України та його закономірності. Джерела вивчення історії України: усні міфи легенди казки народні пісні; писемні літописи документи щоденники мемуари; речові залишки жител знаряддя праці посуд одяг; антропологічні залишки людських поховань; мовні явища які відображають процес розвитку мови; етнографічні побут і звичаї народу; фоно й фотодокументи.На територію сучасної України люди прийшли...
48439. Учет основных средств 52.38 KB
  УЧЕТ СТОИМОСТИ ОСНОВНЫХ СРЕДСТВ Основные средства переносят свою стоимость на готовый продукт постепенно в течение длительного времени охватывающего несколько производственно-технологических циклов. Поэтому учет основных средств и отражение их в балансе организованы таким образом чтобы одновременно можно было показать сохранение ими первоначальной вещной формы и постепенную потерю стоимости. Следует различать первоначальную остаточную восстановительную стоимость основных средств. Первоначальная стоимость отражает фактические затраты на...