Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать
  1. Успадкування віртуальних функцій

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

// Цей клас виведено з класу firstD, а не з baseClass.

class secondD : public firstD {

public:

// Перевизначення функції Show() для класу secondD.

Void Show() {cout« Суг("Другий похідний клас.") « endl;}

};

Якщо похідний клас не перевизначає віртуальну функцію, то використо­вується функція, яку було визначено в базовому класі. Наприклад, перевіримо, як поведеться версія попереднього коду програми, якщо у похідному класі secondD не буде перевизначено функції Show().

Код програми 6.3. Демонстрація механізму успадкування віртуальних функцій #include <vcl>

#include <conio>

#include <iostream> // Для потокового введення-виведення using namespace std; // Використання стандартного простору імен

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

public:

Virtual void Show() {cout« Суг("Базовий клас.") « endl;}

};

class firstD : public baseClass { // Knac firstD виведений з класу baseClass public:

Void Show() {cout« Суг("Перший похідний клас. ")« endl;}

};

class secondD : public baseClass { // Knac secondD виведений з класу baseClass // Функція ShowO тут взагалі не визначена.

};

Int mainO

{

baseClass ObjB;

// Створення об'єкта базового типу

baseClass *bp;

// Створення покажчика на об'єкт базового типу

firstD ObjF;

// Створення об'єкта похідного типу

secondD ObjS;

// Створення об'єкта похідного типу

bp = &ObjB;

// Присвоєння покажчику адреси об'єкта базового класу

bp->Show();

// Доступ до функції Зііо\л/() класу ЬазеСІазз

bp = &ObjF;

// Присвоєння покажчику адреси об'єкта похідного класу

bp->Show();

// Доступ до функції Зііо\л/() класу йгаЮ

bp = &ObjS;

// Присвоєння покажчику адреси об'єкта похідного класу

bp->Show();

1* Тут здійснюється звернення до функції вІпошО класу

ЬазеСІазз, оскільки у класі зесопЬб вона не перевизначена. */

getchQ; return 0;

}

Тепер у процесі виконання цієї програми на екран виводиться таке:

Базовий клас.

Перший похідний клас.

Базовий клас.

Як підтверджують отримані результати виконання цієї програми, оскільки функція Зііо\л/() не перевизначена у похідному класі бєсопсЮ, то під час її виклику за допомогою настанови Ьр->ЗІіо\л/() (коли член р вказує на об'єкт виконується та версія функції Зііо\л/(), яку було визначено у базовому класі ЬазеСІазз.

Вартоа нати! Успадковані властивості специфікатора virtual є ієрархічни­ми. Тому, якщо попередній приклад змінити так, щоб похідний клас secondD був виведений з похідного класу firstD, а не з базового класу baseCtass, то під час звернення до функції ShowQ через об'єкт типу secondD буде викликано ту її вер­сію, яка оголошена у похідному класі firstD, оскільки цей клас є "найближчим" (за ієрархічними "мірками") до похідного класу secondD, а не функцію ShowQ з тіла базового класу baseCtass. Ці ієрархічні залежності демонструються на прикладі наведеної нижче програми.

Код програми 6.4. Демонстрація механізму ієрархії успадкування віртуальних функцій

#include <vcl>

#include <conio>

#include <iostream> // Для потокового введення-виведення using namespace std; // Використання стандартного простору імен

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

public: