67321

Наслідування. Повторне використання коду

Лекция

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

Повторне використання коду План Поняття про наслідування в класах Управління механізмом доступу до членів базового класу Наслідування один з трьох фундаментальних механізмів об'єктноорієнтованого програмування оскільки саме завдяки йому уможливлюється створення ієрархічних класифікацій.

Украинкский

2014-09-07

224.5 KB

13 чел.

Лекція № 15

Тема: Наслідування. Повторне використання коду

План

  1.  Поняття про наслідування в класах
  2.  Управління механізмом доступу до членів базового класу

    Наслідування – один з трьох фундаментальних механізмів об'єктно-орієнтованого програмування, оскільки саме завдяки йому уможливлюється створення ієрархічних класифікацій. Використовуючи механізми наслідування, можна розробити загальний клас, який визначає характеристики, що є властиві множині взаємопов'язаним між собою елементам. Цей клас потім може наслідуватися іншими, вузькоспеціалізованими класами з додаванням у кожен з них своїх, властивих тільки їм унікальних особливостей.

    У стандартній термінології мови програмування C++ початковий клас називається базовим. Клас, який успадковує базовий клас, називається похідним. Похідний клас можна використовувати як базовий для іншого похідного класу. За таким механізмом якраз і будується багаторівнева ієрархія класів.

  1.   Поняття про наслідування в класах

   Мова програмування C++ підтримує механізм успадкування, який дає змогу в оголошенні класу вбудовувати інший клас. Для цього базовий клас задається під час оголошення похідного класу. Щоб зрозуміти сказане, почнемо з конкретного прикладу. Розглянемо клас dorZasib, який загалом визначає дорожній транспортний засіб. Його члени даних дають змогу зберігати наявну кількість коліс і можливу кількість пасажирів, яких може перевозити транспортний засіб:

  // Оголошення базового класу транспортних засобів

class dorZasib

{

    int kolesa; // Кількість коліс

    int pasagyr; // Кількість пасажирів

 public:

    void setKolesa(int f) { kolesa = f; }

    int getKolesa() { return kolesa; }

    void setPasagyr(int t) { pasagyr = t; }

    int getPasagyr() { return pasagyr; }

};

 

 Таке загальне визначення дорожнього транспортного засобу є частиною визначення будь-якого конкретного типу автотранспорту. Наприклад, у наведеному нижче оголошенні класу шляхом успадкування класу dorZasib створюється клас vanAuto – вантажних автомобілів:

  // Оголошення похідного класу вантажівок.

class vanAuto : public dorZasib

{

    int mistkist; // вантажомісткість у м куб.

 public:

    void setMistkist(int h) { mistkist = h; }

    int getMistkist() { return mistkist; }

    void Show(char *s);

};

   Той факт, що клас vanAuto успадковує клас dorZasib, означає, що клас vanAuto успадковує весь вміст класу dorZasib. До вмісту класу dorZasib клас vanAuto додає свого члена даних mistkist, а також функції-члени, необхідні для його підтримки.

   Зверніть увагу на те, як успадковується клас dorZasib. Загальний формат для забезпечення механізму успадкування має такий вигляд:

class ім'я_похідного_класу : доступ ім'я_базового_класу

{

тіло нового класу

}

    У такому оголошенні похідного класу елемент доступ є необов'язковим. У разі потреби він може бути виражений одним із специфікаторів доступу: public, private або protected. Ґрунтовніше про них буде сказано нижче у цьому розділі. А поки що у визначеннях усіх успадкованих класів будемо використовувати специфікатор доступу public. Це означає, що всі public-члени базового класу також будуть public-членами похідного класу. Отже, у наведеному вище прикладі члени класу vanAuto мають доступ до відкритих функцій-членів класу dorZasib, неначе вони (ці функції) були оголошені в тілі класу vanAuto. Проте клас vanAuto не має доступу до private-членів класу dorZasib. Наприклад, для класу vanAuto закритий доступ до членів даних kolesa і pasagyr.

    Розглянемо код програми, яка демонструє механізм успадкування двох підкласів класу dorZasib: vanAuto і lehAuto.

Приклад1. Демонстрація механізму успадкування двох підкласів

    // Оголошення базового класу транспортних засобів

class dorZasib

{    int kolesa; // Кількість коліс

    int pasagyr; // Кількість пасажирів

 public:

    void setKolesa(int f) { kolesa = f; }

    int getKolesa() { return kolesa; }

    void setPasagyr(int t) { pasagyr = t; }

    int getPasagyr() { return pasagyr; }

};

    // Оголошення похідного класу вантажівок.

class vanAuto : public dorZasib

{    int mistkist; // вантажомісткість у м куб.

 public:

    void setMistkist(int h) { mistkist = h; }

    int getMistkist() { return mistkist; }

    void Show(char *s);

};

            //   enum type {car, van, wagon}; // Перерахунковий тип даних

    // Оголошення похідного класу автомобілів.

class lehAuto : public dorZasib

{     int carType;

           //   enum type  carType;

 public:

    void setType(int t) { carType = t; }

    int getType() { return carType; }

    void Show(char *s);

};

void vanAuto::Show(char *s)

{    cout << "Transportnuj zasib: " << s << endl;

    cout << "kolis: " << getKolesa() << " wt" << endl;

    cout << "pasazuriv: " << getPasagyr() << " osib" << endl;

    cout << "vantazomistkist': " << mistkist << " m kyb" << endl;

    cout << endl;

}

void lehAuto::Show(char *s)

{   cout << "Transportnuj zasib: " << s << endl;

    cout << "kolis: " << getKolesa() << " wt" << endl;

    cout << "pasazuriv: " << getPasagyr() << " osib" << endl;

/*cout << "tup: ";

switch(getType()) {

case van: cout << "avtofyrgon" << endl;

break;

case car: cout << "legkovuj" << endl;

break;

case wagon: cout << "fyra" << endl;

} */

   cout << endl;

}

void main()

{     vanAuto ObjT, ObjF;

      lehAuto ObjG;

                // Ініціалізація об'єкта типу вантажівка

      ObjT.setKolesa(18);

      ObjT.setPasagyr(2);

      ObjT.setMistkist(160);

                // Ініціалізація об'єкта типу вантажівка

      ObjF.setKolesa(6);

      ObjF.setPasagyr(3);

      ObjF.setMistkist(80);

               // Виведення інформації про об'єкт типу вантажівка

      ObjT.Show("Vantazivka 1");

      ObjF.Show("Vantazivka 2");

               // Ініціалізація об'єкта типу автомобіль

      ObjG.setKolesa(4);

      ObjG.setPasagyr(6);

            //ObjG.setType(van);

               // Виведення інформації про об'єкт типу автомобіль

      ObjG.Show("Avtomobil");

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Транспортний засіб: Вантажівка 1

коліс: 18 шт.

пасажирів: 2 осіб

вантажомісткість: 160 м куб.

Транспортний засіб: Вантажівка 2

коліс: 6 шт.

пасажирів: 3 осіб

вантажомісткість: 80 м куб.

Транспортний засіб: Автомобіль

коліс: 4 шт.

пасажирів: 6 осіб

   Як видно з результатів виконання цієї програми, основна перевага успадкування полягає у тому, що вона дає змогу створити базовий клас, який потім можна використовувати у складі похідних, більш спеціалізованих класів. Таким чином, кожен похідний клас може слугувати певній меті та, водночас, залишатися частиною загальної класифікації.

   Після поверхневого ознайомлення із загальним механізмом успадкування одним класом іншого можна перейти і до вивчення конкретних його деталей.

  1.  Управління механізмом доступу до членів базового класу

   Якщо один клас успадковує інший, то члени базового класу стають членами похідного. Статус доступу до членів базового класу у похідному класі визначається специфікатором доступу, який використовують для успадкування базового класу. Специфікатор доступу до членів базового класу виражається одним з ключових слів: public, private або protected. Якщо специфікатор доступу не вказано, то за замовчуванням використовується специфікатор private, коли йдеться про успадкування типу class. Якщо ж успадковується тип struct, то за відсутності безпосередньо заданого специфікатора доступу використовується специфікатор public.

   Розглянемо поки що раміфікацію (розгалуження) використання специфікаторів доступу до членів класу public або private1 (риc.1).

Рис. 1. Управління механізмом доступу до членів базового класу

   В усіх випадках private-члени базового класу залишаються закритими у межах цього класу і не доступні для членів похідного. Наприклад, у наведеному нижче коді програми public-члени класу baseClass стають public-членами класу derived. Отже, вони будуть доступними і для інших частин програми.

Приклад 2. Демонстрація механізму доступу до членів базового класу після їх  

                     успадковується як public-клас

   // Оголошення базового класу

class baseClass

{

 int c, d;

public:

 void setB(int a, int b) { c = a; d = b; }

 void showB(char *s)

    { cout << s << "c= " << c << "; d= " << d << endl; }

};

   // Оголошення похідного класу

class derived : public baseClass

{     int f;

public:

derived(int x) { f = x; }

 void showF(char *b, char *p)

     { showB(b); cout << p << "f= " << f << endl; }

};

int main()

{

derived ObjD(3);

   // Доступ до членів класу baseClass

ObjD.setB(1, 2);

   // Доступ до членів класу baseClass

ObjD.showB("Bazovuj klass: "); cout << endl;

   // Доступ до члена класу derived

ObjD.showF("Bazovuj klass: ", "Pohidnuj klass: ");

getch(); return 0;

}

    Внаслідок виконання ця програма відображає на екрані такі результати:

Базовий клас: c= 1; d= 2

Базовий клас: c= 1; d= 2

Похідний клас: f= 3

    Оскільки функції setB() і showB() (члени класу baseClass) успадковані класом derived як public-члени, то їх можна викликати для об'єкта типу derived у функції main(). Позаяк члени даних c та d визначені як private-члени, то вони залишаються закритими у межах свого класу baseClass.

    Протилежністю відкритому (public) успадкуванню є закрите (private).

    Наприклад, наведений вижче код програми не відкомпілюється, якщо ми замінимо рядок

class derived : public baseClass

таким

class derived : private baseClass

оскільки обидві функції setB() і showB() тепер стали private-членами класу derived (тобто, доступними тільки для функцій-членів похідного класу), і тому їх не можна викликати з функції main().


 

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

30899. Клинико-физиологическая оценка внешнего дыхания. Легочные объемы 36.5 KB
  Легочные объемы Анатомофизиолгические показатели легочные объемы определяются антропометрическими данными индивидуума : 1ростовесовыми показателями 2 строением грудной клетки 3 дыхательных путей 4 строением и свойствами легочной ткани эластическая тяга легких поверхностное натяжение альвеол 5 силой дыхательных мышц Легочные объёмы и ёмкости ОЕЛ ЖЕЛ РОвд ЕВвд ДО РОвыд ФОЕ ОО Коллапсный О Минимальный О Легочные объемы: Общая емкость легких ОЕЛ количество воздуха находящееся в легких после максимального вдоха. ОЕЛ состоит...
30900. Клинико-физиологическая оценка внешнего дыхания. Функциональные показатели 27.5 KB
  Минутный объем дыхания МОД объем воздуха который проходит через легкие за 1 минуту. Этот показатель можно определить двумя методами: с помощью спирографии ДО умножается на частоту дыхания и путем сбора воздуха в мешок Дугласа. МВЛ это максимальное количество воздуха которое может вдохнуть и выдохнуть пациент за 1 минуту ЧД более 50 уд мин; N=1418. Форсированная жизненная емкость легких ФЖЕЛ количество воздуха которое пациент может выдохнуть за счет экспираторного маневра максимально быстро и полно .
30901. Газообмен в легких и тканях 34 KB
  Газовый состав вдыхаемого альвеолярного и выдыхаемого воздуха Дыхательные газы Вдыхаемый воздух Альвеолярный воздух Выдыхаемый воздух О2 мм рт. в процессе жизнедеятельности идет постоянный процесс потребления О2 и выделения СО2 это поддерживает концентрацию дыхательных газов в нем на постоянном уровне. Обмен газов между альвеолярным воздухом и кровью. Транспорт газов кровью.
30902. Транспорт газов кровью 280.5 KB
  В жидкой части крови растворены газы воздуха: кислород углекислый газ азот. При содержании гемоглобина 150 г л норма каждые 100 мл крови переносят 208 мл О2. Это кислородная емкость крови. Другой показательсодержание кислорода в крови взятой в различных участках сосудистого русла: артериальной 20 мл О2 100 мл крови и венозной 14 млО2 100 мл крови .
30903. Регуляция дыхания 30.5 KB
  Регуляция дыхания Главная задача регуляции дыхания чтобы потребление кислорода поставка его тканям за счет внешнего дыхания были адекватны функциональным потребностям организма. Самый эффективный способ регуляции дыхания в целом это регуляция внешнего дыхания. Интенсивность внешнего дыхания зависит от варьирования его частоты и глубины. В регуляции дыхания можно выделить 3 группы механизмов: 1.
30904. Механизмы перестройки внешнего дыхания 32 KB
  Накопление СО2 в крови гиперкапния стимулирует дыхание человек будет дышать глубже и чаще. СО2 вымывается из крови гипокапния . ещё до повышения уровня СО2 в крови. Регуляция тонуса сосудов легких 1 Ведущая роль принадлежит газовому составу крови: понижение содержания в крови СО2 приводит к повышению тонуса легочных сосудов при этом уменьшается количество крови которое успевает обогатиться в легких О2 за единицу времени; увеличение СО2 наоборот уменьшает тонус легочных сосудов а значит повышается кровоток и газообмен.
30905. Пищеварение и его значение 36.5 KB
  Методы исследования пищеварительного тракта : XVIII век начало формирования научных методов исследования пищеварительного тракта и его функций. Все методы подразделяются на: 1. Острые методы : Характерная особенность острых экспериментов результат быстро как правило однократно условия далеки от физиологических . а вивисекционный метод прижизненное вскрытие ; б метод изоляции органов или участков органов перфузия питатательными растворами чувствительность к БАВ; в методы канюлирования выводных...
30906. Виды моторики пищеварительного тракта 49 KB
  Физиологические свойства и особенности гладкой мускулатуры пищеварительной трубки Гладкая мускулатура пищеварительной трубки состоит из гладкомышечных клеток ГМК. Межклеточные контакты ГМК пищеварительной трубки обеспечивает наличие нексусов. ГМК пищеварительной трубки обладают рядом физиологических свойств: возбудимостью проводимостью и сократимостью. Особенности возбудимости ГМК пищеварительной трубки: Возбудимость ГМК пищеварительной трубки ниже чем у миоцитов поперечнополосатой мускулатуры ППМ.
30907. Пищеварение в полости рта 27.5 KB
  Пищеварение в полости рта Секреция в ротовой полости В ротовой полости слюну вырабатывают 3 пары крупных и множество мелких слюнных желез. 1 Время нахождения пищи в ротовой полости в среднем 1618 секунд. Е нормальная микрофлора ротовой полости которая угнетает патологическую. В пределах ротовой полости ферменты слюны практически не оказывают влияния изза незначительного времени нахождения пищевого комка в ротовой полости.