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


 

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

49992. ИЗУЧЕНИЕ ЯВЛЕНИЯ ТЕПЛОВОГО ИЗЛУЧЕНИЯ 200.5 KB
  Энергия нагретого тела E1 много больше энергии излучения E2 что и составляет сущность проблемной ситуации. Происхождение теплового излучения При нагревании любого тела повышается запас его энергии сосредоточенной на различных степенях свободы: поступательного движения атомов и молекул газа вращательного и колебательного движения атомов или ионов в молекулах и кристаллах и т. Таким образом любые нагретые тела т. тела с температурой больше 0 К испускают электромагнитное излучение микроскопические механизмы которого различны в разных...
49993. ОПРЕДЕЛЕНИЕ ПОСТОЯННОЙ ПЛАНКА СПЕКТРОМЕТРИЧЕСКИМ МЕТОДОМ 942 KB
  Краткое теоретическое введение Согласно квантовой теории излучение света атомами вещества связано с изменением их энергетического состояния. По теории Бора переход атома водорода из одного энергетического состояния в другое связан с переходом электрона атома с одной орбиты на другую. Орбиты электрона в атоме квантованы и поэтому энергия атома водорода не может иметь любое произвольное значение.
49994. ЭКСПЕРИМЕНТАЛЬНАЯ ПРОВЕРКА СООТНОШЕНИЯ НЕОПРЕДЕЛЕННОСТЕЙ ДЛЯ ФОТОНОВ 130.5 KB
  Одним из фундаментальных положений квантовой механики является принцип неопределенностей сформулированный В. О том каково его значение можно судить исходя из того факта что всего одного из соотношений неопределенностей достаточно чтобы объяснить целый ряд закономерностей в атомной и ядерной физике. Обозначив канонически сопряженные величины буквами А и В можно написать B ≥ 3 Соотношение 3 называется соотношением неопределенностей для величин А и В.
49995. Стройові вправи. Загальнорозвивальні вправи 69 KB
  Стройові вправи. Шикування як вид стройових вправ. Загальнорозвивальні вправи. Прикладні вправи.
49997. Нечеткая логика. Создание простейшей системы нечеткой логики 67 KB
  Создание простейшей системы нечеткой логики реализованной на языке высокого уровня. Задание Согласно заданным вариантам разработать программу на любом алгоритмическом языке способную: Различать степени изменения лингвистической переменной в трех степенях...
49998. МИКРОПРОГРАММИРОВАНИЕ КОМАНД СМ ЭВМ 92 KB
  Цель работы: Знакомство с принципами микропрограммной эмуляции ЭВМ с программным управлением, микропрограммирование машинных команд СМ ЭВМ. Вариант индивидуального задания: № 5 Найти наибольший общий делитель двух чисел по алгоритму Евклида.
49999. Трёхступенчатая токовая защита линий с односторонним питанием 540 KB
  Представить совмещенные друг с другом и со структурной схемой системы следующие графики: зависимости максимального и минимального токов коротких замыканий от удалённости места КЗ; все токовые уставки; зависимости времени срабатывания защиты от удаленности КЗ уставки по времени. Оценить эффективность отсечек по зоне действия МТЗ по коэффициенту чувствительности рассчитанной защиты. Исходные данные к контрольной работе № вариантата Параметры энергосистемы Параметры линий электропередачи и нагрузок W1 H1 W2 H2 W3 H3 Ec B xc Ом...
50000. Измерение параметров электромагнитного контура 758.5 KB
  Теоретические основы лабораторной работы В технике колебательные процессы выполняют либо определенные функциональные обязанности колесо маятник колебательный контур генератор колебаний и т. Такие периодические изменения зарядов напряжений и токов в контуре носят название электромагнитных колебаний. В некоторый момент времени полная энергия колебаний: где U и i мгновенные значения разности потенциалов и тока. Полная энергия колебаний постепенно уменьшается так как электрическая энергия благодаря сопротивлению проводов R непрерывно...