Отправляет email-рассылки с помощью сервиса Sendsay

Инвестирование с нуля

  Все выпуски  

Программирование на Си и С++ с нуля 167) Наследование классов


Школа программирования

167) Программирование на С++: Наследование классов

Функциональность автомобиля (свойства, методы класса Car) будет примерно одинакова для автомобилей практически любых марок. Грузовые автомобили будут отличаться наличием кузова или прицепа, однако почти все различия будут сводиться даже не к структуре классов, а к значениям отдельных свойств. Например, свойство "мощность двигателя" уже позволяет создавать множество автомобилей разных марок, от инвалидных до гоночных - лишь путем изменения его значений. Но некоторые свойства и методы будут все же специфичны для разных типов автомобилей.

Например, наличие встроенного музыкального центра, пожалуй, все же относится к легковым автомобилям, а наличие кузова - к грузовым. Но если мы будем создавать каждый из классов "Легковой автомобиль" и "Грузовой автомобиль" с нуля, нам придется 90-99% всей функциональности классов просто повторить, скопировать - она не будет различаться. При этом, если мы вздумаем в будущем изменить логику какого-нибудь метода (например, метода "Ехать"), то изменения надо будет вносить в метод каждого из двух классов. А если таких классов не два, а десятки или тысячи, что нередко бывает в прикладных проектах, моделирующих сложную область деятельности? Тогда внесение простого исправления превращается в длительный рутинный процесс, чреватый ошибками.

К счастью, принцип объектного наследования позволяет создавать классы на основе уже существующих классов. Создадим исходный (говорят - родительский) класс Car, в который выделим элементы, общие для всех автомобилей независимо от их принадлежности. В качестве микропримера возьмем уже созданный ранее класс Car:

   class Car
     {
     public:
      double Benzin; // бензин

      void Go( float dist ) {
      Benzin -= dist / 10; // 1 литр бенза на 10 км
      Rasst += dist; // проехали
      }

     private:
      double Rasst; // пройденное расстояние
     };

Все его элементы можно считать общими и для грузовых, и для легковых машин.

Допустим, мы хотим создать класс Truck (Грузовик), который будет отличаться от класса Car лишь наличием нового поля Kuzov :) Можно скопировать код класса Car и модифицировать его, но это неверный подход.

Создадим класс Truck на базе класса Car. Для этого используется следующий синтаксис:

Класс-наследник : Родительский-класс
{ ...

В нашем случае:

   class Truck : Car
   {
   public:
    int Kuzov;
   };

Хотя в теле класса Truck явно определено только одно поле Kuzov, на самом деле в класс Truck входят также все поля из родительского класса Car. Более того, если у класса Car имелся бы собственный родительский класс, то в класс Truck перешли бы также и все элементы того вышестоящего класса (точнее, все элементы с допустимой видимостью).

По умолчанию public-элементы из родительского класса включаются в класс-наследник с видимостью, измененной на private. В данном примере унаследованное поле Benzin в классе Truck будет видимо как private - то есть только в пределах описания класса и его наследников, но извне класса обращаться к нему нельзя. Чтобы сохранить видимость наследуемых элементов на уровне public, надо перед именем родительского класса в заголовке описания класса поставить ключевое слово public:

   class Truck : public Car
   {
   public:
    int Kuzov;
   };

Если теперь создать новый класс на базе класса Truck, то в него помимо элементов Car попадет и поле Kuzov.

Теперь можно записать так:

   Truck* tr;
   tr = new Truck;

   // собственное свойство:
   tr->Kuzov = 5000;

   // свойства, унаследованные от родителя:
   tr->Benzin = 99.5; // заливаем в бак бензин
   tr->Go(); // поехали!

В следующем занятии изучим такую важную характеристику классов и объектов (последнюю из трех ключевых :), как полиморфизм.


(c) 2004-2007 Сергей Бобровский : bo собака russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Неофициальный сайт поддержки (со срочными вопросами - сюда):
www.prog-begin.net.ru.


Мои книги (учебные курсы) "Технологии Delphi / C++ / C#. Разработка приложений для бизнеса".
http://shop.piter.com/display.phtml?a_id=17681&web_ok=all

Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией.
В книгах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Delphi 2005/2006/2007 и Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.

Мои книги, которые пока доступны в продаже:


Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное