68954

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

Лекция

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

Якщо конструктор похідного класу повинен отримувати декілька параметрів слід просто використовувати стандартну синтаксичну форму конструктора з параметрами. Проте виникає питання яким чином передаються аргументи конструктору базового класу

Украинкский

2014-09-28

47.5 KB

1 чел.

Лекція № 16

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

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

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

base2 (список__аргументов) baseN(список аргументів)

{

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

}

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

#include <iostream> using namespace std; class base { protected:

int i; public:

base(int x) { i=x; cout << "Створення об\'єкту класу base\n"; }

-base() { cout << "Знищення об\'єкту класу base\n"; } }; class derived: public base {

int j ; public:

// Клас derived використовує змінну x; // змінна у передається базовому класу.

derived(int x, int у): base(у)

{

j=x;

cout << "Створення об\'єкту класу derived\n";

}

-derived() {

cout << "Знищення об\'єкту класу derived\n»;

}

void show() { cout << і << " " << j « endl; } };

int main() {

derived ob (3, 4);

ob.show(); // Виводить на екран числа 4 З

return 0; }


Тут конструктор класу derived має два параметри: х і у. Проте в самому конструкторі використовується лише змінна х, а змінна у передається конструктору базового класу. Як правило, в конструкторі похідного класу повинні оголошуватися всі параметри, необхідні базовому класу. Для цього вони указуються після двокрапки в списку аргументів конструктора базового класу.

Розглянемо приклад множинного наслідування.

#include <iostream>

using namespace std;

class basel {

protected:

int i;

public:

basel(int x) { i=x; cout << "Створення об\'єкту класу basel\n"; } -basel() { cout << "Знищення об\'єкту класу basel\n"; }

};

class base2 { protected:

int k; public:

base2(int x) { k=x; cout << "Створення об\'єкту класу base2\n"; }

~base2() { cout << "Знищення об\'єкту класу base2\n"; } }; class derived: public basel, public base2 {

int j ; public:

derived(int x, int y, int z): basel(y), base2(z)

{

j=x; cout << "Створення об\'єкту класу derived\n";

}

-derived() ( cout << "Знищення об\'єкту класу derived\n"; } void show() ( cout « і << " " << j « " " << k << endl; } };

int main() {

derived ob(3, 4, 5);

ob.show(); // Виводить на екран числа 4 3 5

return 0; }

Підкреслимо, що аргументи конструктора базового класу передаються за допомогою аргументів конструктора похідного класу. Отже, навіть якщо конструктор похідного класу не має власних аргументів, його оголошення повинне містити аргументи конструкторів базових класів. В цьому випадку аргументи, передавані конструктору похідного класу, просто переправляються конструкторам базових класів. Наприклад, в розглянутій нижче програмі конструктор класу derived не має власних аргументів, а конструктори класу basel і base2, навпаки, мають по одному параметру.

#include <iostream> using namespace std; class basel { protected:

int i; public:

basel(int x) { i=x; cout << "Створення об\'єкту класу basel\n"; }


-basel() { cout << "Знищення об\'єкту класу basel\n"; } };

class base2 { protected:

int k; public:

base2(int x) { k=x; cout << "Створення об\'єкту класу base2\n"; }

~base2() { cout << "Знищення об\'єкту класу base2\n"; } };

class derived: public basel, public base2 { public:

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

в його оголошенні указуються параметри конструкторів

базових класів. */

derived(int х, int у): basel (x), base2(у)

{

cout << "Створення об\'єкту класу derived\n";

}

-derived() { cout << "Знищення об\'єкту класу derived\n"; }

void show() { cout << і << " " << k << "\n"; } };

int main() {

derived ob(3, 4);

ob.show(); // Виводить на екран числа 3 4

return 0; }

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

class derived: public base { int j ; public:

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

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

derived(int x, int у): base(x, у)

{ j = x*y; cout << "Створення об\'єкту класу derived\n"; }

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


 

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

64677. ТУРИСТСКО-РЕКРЕАЦИОННЫЙ ПОТЕНЦИАЛ КРЫМСКОГО ПОЛУОСТРОВА 756.4 KB
  Целью данной работы является изучение состояния и оценка перспектив развития туристско-рекреационного потенциала Крыма. Для достижения необходимо решить следующие задачи: Оценить состояние природно-рекреационных экономических и культурно-исторических ресурсов Крыма...
64678. Расчёт основных электрических и конструктивных параметров однофазного силового трансформатора 8.23 MB
  Характер требований, предъявляемых к трансформаторам малой мощности и средней мощности, в значительной мере зависит от назначения аппаратуры, для которой проектируется данный трансформатор.
64679. Розвиток виробничого підприємництва на Івано-Франківщині 164.5 KB
  Мета роботи – описати основні підприємства Івано-Франківської області, та їх роль в економіці області вцілому. Для того щоб досягти поставленої мети, потрібно виконати такі завдання: дати характеристику основним виробничим підприємствам області; визначити роль підприємств у економіці області.
64680. Разработка программы шифрования 333.18 KB
  Цель курсовой работы – создание программного продукта, который бы позволял обычным пользователям компьютера зашифровывать и дешифровать необходимый им текст. Для достижения этой цели были поставлены следующие задачи: изучить теоретические сведения, необходимые для решения данной задачи...
64681. Особенности раздела общего имущества супругов 39.35 KB
  Целью работы является изучение особенностей судебных споров о разделе имущества. К задачам изучения относится: понятие и особенности общего имущества супругов объекты общей совместной собственности супругов...
64682. Процесс становления рыночного механизма в современной России 50.89 KB
  Без товарного производства нет рынка без рынка нет товарного производства. Эти условия зарождались и развивались как единое целое как единый процесс взаимодействия производства и сбыта продукции. Рынок это обмен организованный по законам товарного производства...
64683. Годівля однорічки кижуча 2.73 MB
  Перехід від тимчасового утримування риби у штучних конструкціях до її культивування ґрунтувався на здатності конкретних видів риб харчуватися природними і штучними кормами у пропонованих умовах утримання. В умовах спеціалізованих рибницьких господарств вирощування риби...
64684. Создание программного продукта реализующего различные методы шифрования текста 620.26 KB
  Предмет курсовой работы – это программный продукт, реализующий такие методы шифрования как шифр Цезаря, шифр с заменой букв цифрами и шифр Полибиуса. Цель курсовой работы – создание программного продукта, который бы позволял обычным пользователям компьютера...