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++.


 

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

84635. Проводники и диэлектрики в электрическом поле. Электрическое поле вне и внутри проводника 686.5 KB
  Проводники и диэлектрики в электрическом поле. Электрическое поле вне и внутри проводника. При помещении проводника в электрическое поле его заряды начнут перемещаться что приведет к частичному разделению его зарядов. Отсутствие поля внутри проводника помещенного в электрическое поле применяется...
84636. РЕГЕНЕРАТОРЫ ГАЗОТУРБИННЫХ УСТАНОВОК 7.06 MB
  Непременным условием создания любого теплового двигателя является наличие материальной среды – рабочего тела и, по меньшей мере, двух тепловых источников – источника высокой температуры (нагреватель), от которого получаем теплоту для преобразования части ее в работу...
84637. Социальное партнерство (социальный диалог) в охране труда 87.5 KB
  Социальное партнерство как принцип законодательного и нормативно правового обеспечения охраны труда. Социальное партнерство решает следующие вопросы: достижение консенсуса по вопросам обеспечения занятости; Создание дополнительных рабочих мест; Применение наемного труда с соблюдением...
84638. Анализ пассивов банка 43.69 KB
  Уставный фонд банка является основной составляющей собственных средств кредитной организации. Ему принадлежит наибольший удельный вес в собственном капитале. Поэтому важным направлением анализа собственного капитала банка является изучение уставного фонда.
84639. Основи місцевого самоврядування 84.5 KB
  Основи місцевого самоврядування Конституційно правові основи місцевого самоврядування в Україні. Матеріальна основа місцевого самоврядування. Фінансова основа місцевого самоврядування. Місцеві бюджети та позабюджетні кошти місцевого самоврядування.
84640. Сучасна система місцевого самоврядування в Україні та її елементи 145 KB
  Сучасна система місцевого самоврядування в Україні та її елементи Поняття і система місцевого самоврядування. Територіальна громада основний елемент системи місцевого самоврядування. Поняття та види органів місцевого самоврядування. Представницькі органи місцевого самоврядування сільські селищні міські ради.
84641. Основное и дополнительное сырье хлебопекарного производства, хранение тарное и бестарное. Виды и сорта муки. Значение химического состава муки в технологическом процессе 31.15 KB
  На всех этапах производственного процесса осуществляется сложный комплекс коллоидных, биохимических, микробиологических процессов, в результате которых мука превращается в хлеб - высококачественный продукт, обладающий вкусовыми свойствами и структурой, обеспечивающей его хорошую усвояемость.
84642. Хлебопекарные дрожжи, их микробиологическая и химическая характеристика. Виды хлебопекарных дрожжей, хранение и подготовка к производству. Сущность активации дрожжей 20.47 KB
  Дрожжи хлебопекарные являются основным видом сырья для производства хлеба и хлебобулочных изделий. Технологическая и функциональная роль дрожжей заключается в биологическом разрыхлении теста диоксидом углерода выделяющимся в процессе спиртового брожения придании тесту определённых реологических...
84643. Жидкие дрожжи и их технологическое значение, микрофлора. Разводочный и производственный циклы приготовления, основные схемы приготовления, их сравнительная оценка. Показатели качества жидких дрожжей 22.62 KB
  Показатели качества жидких дрожжей Понятие о жидких дрожжах и их технологическом значении Жидкие дрожжи используются в отечественном хлебопечении в качестве биологического разрыхлителя при производстве хлеба из пшеничной муки смеси пшеничной и ржаной полностью приготовленного на жидких дрожжах...