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


 

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

29126. Исковая давность (понятие, сроки, применение) 28.5 KB
  Исковой давностью признается срок для защиты права по иску лица право которого нарушено. Сроки: Общий срок исковой давности 3 года для отдельных видов требований законом могут устанавливаться специальные сроки исковой давности сокращенные или более длительные по сравнению с общим сроком. Сроки исковой давности и порядок их исчисления не могут быть изменены соглашением сторон. Основания приостановления и перерыва течения сроков исковой давности устанавливаются настоящим Кодексом и иными законами.
29127. Перерыв и приостановление исковой давности. Последствия с ними связанные 30 KB
  Перерыв и приостановление исковой давности. Перерыв течения срока исковой давности предъявлением иска в установленном порядке совершением обязанным лицом действий свидетельствующих о признании долга. После перерыва течение срока исковой давности начинается заново; время истекшее до перерыва не засчитывается в новый срок. Приостановление течения срока исковой давности: если предъявлению иска препятствовало чрезвычайная и непреодолимая сила; если истец или ответчик находится в составе Вооруженных Сил переведенных на военное положение;...
29128. Требования, на которые исковая давность не распространяется 27 KB
  Требования на которые исковая давность не распространяется. Исковая давность не распространяется на: требования о защите личных неимущественных прав и других нематериальных благ; требования вкладчиков к банку о выдаче вкладов; требования о возмещении вреда причиненного жизни или здоровью гражданина. требования собственника или иного владельца об устранении всяких нарушений его права хотя бы эти нарушения не были соединены с лишением владения.
29129. Содержание права собственности 25.5 KB
  Собственнику принадлежат права 1 владение т. Собственник вправе по своему усмотрению совершать в отношении принадлежащего ему имущества любые действия не противоречащие закону. Собственник несет бремя содержания принадлежащего ему имущества если иное не предусмотрено законом или договором. Риск случайной гибели или случайного повреждения имущества несет его собственник если иное не предусмотрено законом или договором.
29130. Формы права собственности 49 KB
  В РФ признаются: Негосударственная Государственная: на праве собственности РФ федеральная собственность на праве собственности субъектам РФ собственность субъекта РФ. Земля и другие природные ресурсы не находящиеся в собственности граждан юридических лиц либо муниципальных образований являются государственной собственностью. Имущество находящееся в государственной собственности закрепляется за государственными предприятиями и учреждениями во владение пользование распоряжение.
29131. Основания возникновения права собственности и их классификация 32 KB
  Находка Нашедший потерянную вещь обязан немедленно уведомить об этом лицо потерявшее ее или собственника вещи и возвратить ему найденную вещь. Вещь может быть также сдана транспортной организации в милицию или орган местного самоуправления. В случае неустановления владельца вещи в 6 месяцев нашедший вещь приобретает право собственности на нее. При возврате вещи владельцу нашедший вещь вправе потребовать от него вознаграждение за находку в размере до 20 стоимости вещи а также возмещение необходимых расходов связанных с хранением или...
29132. Приобретательская давность как основание возникновение права собственности 26.5 KB
  Приобретательная давность лицо гражданин юридическое лицо не являющееся собственником имущества но добросовестно открыто и непрерывно владеющее как своим собственным недвижимым имуществом в течение 15 лет либо иным имуществом в течение 5 лет приобретает право собственности на это имущество. Приобретательная давность это новая для отечественного законодательства форма приобретения права собственности. Право собственности на недвижимое и иное имущество подлежащее государственной регистрации возникает у лица приобретшего это...
29133. Прекращение права собственности 39.5 KB
  Прекращение права собственности – право прекращающие юридические факты которые могут быть связаны с действиями по отчуждению имущества с событиями смерть. Классификация прекращения права собственности: Добровольная – собственник передает это право другому лицу на основании различных договоров административных актов а также при отказе его от права собственности гибели или уничтожении имущества и при утрате права собственности на имущество. Принудительная – обращение взыскания на имущество по обязательствам на основании решения суда...
29134. Отступное в гражданском праве 29.5 KB
  По какимлибо причинам вы ничем кроме честного слова должника свой договор не обеспечили. Пришел час расплаты а денег у должника нет. Первый подать в суд потребовать продажи имущества должника и обязать его расплатиться с вами деньгами вырученными от продажи его имущества. Получив имущество вы отступаете от должника со своими требованиями о возврате долга.