67254

Передача параметрів конструкторам базового класу

Лекция

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

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

Украинкский

2014-09-06

75.5 KB

3 чел.

Лекція № 17

Тема: Передача параметрів конструкторам базового класу

План

  1.  Загальний формат розширеного оголошення конструктора похідного класу
  2.   Демонстрація механізму передачі параметрів конструкторам базового класу.
  3.  Демонстрація механізму передачі параметрів конструкторам декількох базових класів
  4.  Демонстрація механізму передачі аргументів конструкторам базового класу через конструктори похідного класу

   Дотепер жоден з попередніх прикладів не містив конструкторів, для яких потрібно було б передавати аргументи. У випадках, коли конструктор тільки похідного класу вимагає передачі одного або декількох аргументів, достатньо використовувати стандартний синтаксис параметризованого конструктора. Але як передати аргументи конструктору базового класу? У цьому випадку необхідно використовувати розширену форму оголошення конструктора похідного класу, у якому передбачено можливість передачі аргументів одному або декільком конструкторам базового класу.

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

конструктор_похідного_класу (перелік_аргументів):

baseA(перелік_аргументів),

baseB(перелік_аргументів),

. . . . . . . . . . . .

baseN(перелік_аргументів);

{

тіло конструктора похідного класу

}

   Тут елементи baseA, ..., baseN означають імена базових класів, що успадковуються похідним класом. Зверніть увагу на те, що оголошення конструктора похідного класу відділяється від переліку базових класів двокрапкою, а імена базових класів розділяються між собою комами (у разі успадкування декількох базових класів). Для розуміння сказаного розглянемо таку навчальну програму.

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

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

{

protected:

 int c;

public:

baseClass(int x) { c = x; cout << "Stvorennja baseClass-objekta" << endl; }

~baseClass() { cout << "Ryjnyvannja  baseClass-objekta" << endl; }

};

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

class derived : public baseClass

{

 int d;

public:

            // Клас derived використовує параметр x, a параметр y

            // передається конструктору класу baseClass.

derived(int x, int y) : baseClass(y)

       { d = x; cout << "Stvorennja derived-objekta" << endl; }

~derived()

       { cout << "Ryjnyvannja  derived-objekta" << endl; }

 void showB(char *s)

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

};

void main()

{

derived ObjD(3, 4);

ObjD.showB("Bazovuj klass: ");          // Відображає числа 4 3

}

    У цьому коді програми конструктор класу derived оголошується з двома параметрами x і y. Проте конструктор derived() використовує тільки параметр x, а параметр y передається конструктору baseClass(). У загальному випадку конструктор похідного класу повинен оголошувати параметри, які приймає його клас, а також ті, які потрібні базовому класу. Як це показано у наведеному вище прикладі, будь-які параметри, що потрібні базовому класу, передаються йому у переліку аргументів базового класу, які вказуються після двокрапки. Розглянемо приклад програми, у якій продемонстровано механізм передачі параметрів конструкторам декількох базових класів.

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

                 класів

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

{

protected:

 int c;

public:

baseA(int x)

      { c = x; cout << "Stvorennja  baseA-objekta" << endl; }

~baseA()

      { cout << "Ryjnyvannja   baseA-objekta" << endl; }

};

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

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

{

protected:

 int f;

public:

baseB(int x)

    { f = x; cout << "Stvorennja  baseB-objekta" << endl; }

~baseB()

    { cout << "Ryjnyvannja   baseB-objekta" << endl; }

};

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

class derived : public baseA, public baseB

{

 int d;

public:

derived(int x, int y, int z): baseA(y), baseB(z)

     { d = x; cout << "Stvorennja  derived-objekta" << endl; }

~derived()

     { cout << "Ryjnyvannja   derived-objekta" << endl; }

 void showB(char *s)

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

};

void main()

{

derived ObjD(3, 4, 5);

}

   Важливо розуміти, що аргументи для конструктора базового класу передаються через аргументи, які приймаються конструктором похідного класу. Навіть якщо конструктор похідного класу не використовує ніяких аргументів, то він повинен оголосити один або декілька аргументів, якщо базовий клас приймає один або декілька аргументів. У цій ситуації аргументи, що передаються похідному класу, "транзитом" передаються базовому. Наприклад, у наведеному нижче коді програми конструктори baseA() і baseB(), на відміну від конструктора класу derived, приймають аргументи.

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

                через конструктори похідного класу

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

{

protected:

 int c;

public:

baseA(int x)

      { c = x; cout << "Stvorennja  baseA-objekta" << endl; }

~baseA()

      { cout << "Ryjnyvannja   baseA-objekta" << endl; }

};

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

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

{

protected:

 int f;

public:

baseB(int x)

    { f = x; cout << "Stvorennja  baseB-objekta" << endl; }

~baseB()

    { cout << "Ryjnyvannja   baseB-objekta" << endl; }

};

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

class derived : public baseA, public baseB

{

 int d;

public:

                        /* Конструктор класу derived не використовує параметрів, але повинен

                             оголосити їх, щоб передати конструкторам базових класів. */

derived(int x, int y) : baseA(x), baseB(y)

        { cout << "Stvorennja derived-objekta" << endl; }

~derived()

        { cout << "Ryjnyvannja derived-objekta" << endl; }

 void showB(char *s)

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

};

void main()

{

derived ObjD(3, 4);

ObjD.showB("Bazovuj klass: ");       // Відображає числа c= 3; f= 4

}

    Конструктор похідного класу може використовувати будь-які (або всі) параметри, які ним оголошені для прийняття, незалежно від того, чи передаються вони (один або декілька) базовому класу. Іншими словами, той факт, що деякий аргумент передається базовому класу, не заважає його використанню і самим похідним класом. Наприклад, наведений нижче фрагмент коду програми є абсолютно допустимим:

class derived : public baseClass

{          int d;

    public:

                /* Клас derived використовує обидва параметри x і y,

                    а також передає їх класу baseClass */

           derived(int x, int y) : baseClass(x, y)

                      { d = x*y; cout << "Створення derived-об'єкта" << endl; }

      //. . .

}

    При передачі аргументів конструкторам базового класу необхідно мати на увазі, що аргумент, який передається, може містити будь-який (дійсний на момент передачі) вираз, що містить виклики функцій і змінних. Це можливо завдяки тому, що мова C++ дає змогу виконувати динамічну ініціалізацію даних.

Тема: Повернення успадкованим членам класу початкової специфікації доступу

   Коли базовий клас успадковується як закритий (як private-клас), то всі його члени (відкриті, захищені та закриті) стають private-членами похідного класу. Але за певних обставин один або декілька успадкованих членів необхідно повернути до їх початкової специфікації доступу. Наприклад, незважаючи на те, що базовий клас успадковується як private-клас, деяким визначеним його public-членам потрібно надати public-статус у похідному класі. Це можна зробити двома способами:

● по-перше, у похідному класі можна використовувати оголошення using (цей спосіб рекомендується стандартом мови C++ для використання в новому коді програми). Але особливості використання директиви using відкладемо до розгляду теми простору імен (основне призначення директиви using – забезпечити підтримку просторів імен);

● по-друге, можна налагодити доступ до успадкованого члена за допомогою оголошень доступу.

   Зауважмо, що оголошення доступу все ще підтримуються стандартом мови C++, але останнім часом активізувалися заперечення проти його застосування, а це означає, що його не варто використовувати в новому коді програми. Позаяк воно все ще використовуються у мові програмування С++, то дещо приділимо увагу цій темі.

   Оголошення доступу має такий формат:

ім'я_базового_класу::член;

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

class baseClass

{  public:

          int d;       // public-доступ у класі baseClass

};

    // Клас baseClass успадковується як private-клас.

class derived : private baseClass  // Оголошення похідного класу

{  public:

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

          baseClass::d; // Тепер член d знову став відкритим.

    //. . .

};

   Оскільки клас baseClass успадковується класом derived закритим способом, то його public-змінна d стає private-змінною класу derived. Проте внесення цього оголошення доступу

baseClass::d;

в класі derived під специфікатором доступу public відновлює public-статус члена d.

   Оголошення доступу можна використовувати для відновлення прав доступу public- і protected-членів. Проте для зміни (підвищення або пониження) статусу доступу його використовувати не можна. Наприклад, член, оголошений закритим у базовому класі, не можна зробити відкритим у похідному. Механізм використання оголошення доступу продемонстровано в такому коді програми.

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

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

{

 int c;              // private-член у класі baseClass

public:

 int d, f;

 void Set(int x) { c = x; }

 int Put() { return c; }

};

      // Клас baseClass успадковується як private-клас.

class derived : private baseClass

{

public:

        /* Наступні три настанови перевизначають private-успадкування класу

             baseClass і відновлюють public-статус доступу для членів d, Set() і Put(). */

                     // Змінна d стає знову public-членом a змінна f залишається закритим членом

baseClass::d;

baseClass::Set;             // Функція Set() стає public-членом.

baseClass::Put;             // Функція Put() стає public-членом.

     // baseClass::c;        // Неправильно: не можна підвищувати рівень доступу

 int a;             // public-член

};

void main()

{

derived ObjD

        // ObjD.c = 10;         // Неправильно, оскільки член c закритий у класі derived.

ObjD.d = 20;                   // Допустимо, оскільки член d став відкритим у класі derived

     // ObjD.f = 30;           // Неправильно, оскільки член f закритий у класі derived.

ObjD.a = 40;                    // Допустимо, оскільки член a відкрито у класі derived.

ObjD.Set(10);

cout << ObjD.Put() << " " << ObjD.d << " " << ObjD.a;

}

   Зверніть увагу на те, як у цьому коді програми використовуються оголошення доступу для відновлення статусу public у членів d, Set() і Put(). У коментарях відзначені й інші обмеження, пов'язані із статусом доступу.

   Мова програмування C++ забезпечує можливість відновлення рівня доступу для успадкованих членів, щоб фахівець міг успішно програмувати такі спеціальні ситуації, коли велика частина успадкованого класу повинна стати закритою, а колишній public- або protected-статус потрібно повернути тільки декільком членам. Однак до цього засобу програмування краще вдаватися тільки у крайніх випадках.


 

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

20802. Економічні методи управління, регулювання раціонального природокористування та охорони навколишнього середовища 137.5 KB
  Це платежі за ресурси та забруднення надання пільг в оподаткуванні підприємств надання на пільгових умовах коротко і довгострокових позичок для реалізації проектів щодо забезпечення раціонального використання природних ресурсів та охорони навколишнього природного середовища звільнення від оподаткування фондів охорони довкілля; передача частини коштів позабюджетних фондів охорони навколишнього природного середовища на довготривалих договірних умовах підприємствам установам організаціям і громадянам для вжиття заходів із гарантованого...
20803. Економічна та соціальна ефективність здійснення природоохоронних заходів 47 KB
  Економічна та соціальна ефективністьздійснення природоохоронних заходів 8. Методичні вказівки До природоохоронних заходів належать усі види господарської діяльності спрямовані на зниження й ліквідацію негативного антропогенного впливу на навколишнє природне середовище збереження поліпшення і раціональне використання природноресурсного потенціалу країни регіонів а саме: 1 будівництво та експлуатація очисних знешкоджувальних споруд та обладнання; 2 розвиток мало та безвідходних технологічних процесів і виробництв; 3 розміщення...
20804. Науково-технічний прогрес та економіка природокористування 50 KB
  Методичні вказівки Екологічна експертиза в Україні вид науковопрактичної діяльності спеціально уповноважених державних органів екологоекспертних формувань та обєднань громадян що рунтується на міжгалузевому екологічному дослідженні аналізі та оцінці передпроектних проектних та інших матеріалів чи обєктів реалізація та дія яких може негативно впливати або впливає на стан навколишнього природного середовища та здоровя людей спрямована на підготування висновків про відповідність запланованої чи здійснюваної діяльності нормам і...
20805. Регіональні екологічні проблеми України 86.5 KB
  Це було можливим за відсутності ефективно діючих правових адміністративних та економічних механізмів природокористування законодавства з охорони довкілля. Ці та інші чинники зокрема низький рівень екологічної свідомості суспільства призвели до значної деградації довкілля України надмірного забруднення поверхневих і підземних вод повітря й земель нагромадження в дуже великих кількостях шкідливих у тому числі високотоксичних відходів виробництва. Високий рівень концентрації промислових обєктів нераціональна структура промислового...
20806. Курс «Екологія» 107.5 KB
  Він передбачає: засвоєння основних закономірностей взаємодії людини суспільства і природи; ознайомлення з особливостями впливу антропогенних факторів на природне середовище; вивчення проблем повязаних зі станом охороною та раціональним використанням природних ресурсів; управління процесом природокористування. Концепції безплатності та невичерпності природних ресурсів затратнорезультатна концепція; її безпідставність. Диференційна рента як основний критерій економічної оцінки природних ресурсів. Проблема раціонального використання...
20807. Розвиток продуктивних сил та антропогенний вплив на довкілля 92.5 KB
  Наслідком цього стало скорочення окремих життєво важливих ресурсів лісових земельних і водних а також надмірне забруднення довкілля в багатьох регіонах землі. Питома вага різних галузей промисловості й транспорту в загальному обсязі забруднення атмосфери становить у : теплова енергетика 257; чорна металургія 234; нафтовидобувна і нафтохімічна 137; транспорт 116; кольорова металургія 111; гірничодобувна 71; підприємства будівельного комплексу 34; машинобудування 28; інші галузі 12. На всіх його стадіях...
20808. Еколого-економічні проблеми використання природних ресурсів 45.5 KB
  Методичні вказівки Природні ресурси це засоби існування людей не створені їхньою працею які містяться в природі. До них належать вода рунт рослинний і тваринний світ мінеральні ресурси тощо. Природні ресурси класифікують за: 1 їхнім призначенням виробничі та рекреаційні; 2 належністю до тих чи інших компонентів природи земельні лісові мінеральні; 3 вичерпністю вичерпні та невичерпні ресурси. Відновлювані ресурси це рослинний і тваринний світ а також деякі види мінеральних ресурсів зокрема кухонна сіль.
20809. Господарський механізм управління процесом природокористування та правове регулювання охорони навколишнього середовища 51 KB
  Державне управління в царині охорони навколишнього природного середовища здійснюють Кабінет Міністрів України ради народних депутатів та їхні виконавчі й розпорядчі органи а також спеціальні уповноважені на те державні органи з питань охорони природного середовища та використання природних ресурсів. Нині Мінприроди здійснює координацію всіх природоохоронних робіт в Україні готує для Кабінету Міністрів пропозиції з питань охорони природи і раціонального використання водних ресурсів розробляє пропозиції щодо вдосконалення господарського...
20810. Слюсарний верстак. Організація робочого місця у слюсарній майстерні 41.5 KB
  Мета уроку: Засвоєння знань про організацію робочого місця правила безпечної праці та внутрішнього розпорядку у шкільній майстерні. Тип уроку: Засвоєння нових знань.Повідомлення теми мети уроку 1 хв. Підведення підсумків уроку23хв.