
- •Передмова
- •Розділ 1 об'єктний підхід у програмуванні
- •1.1.Причини виникнення ооп
- •1.1.1.Складність об'єкта дослідження
- •1.1.2.Складність процесу розробки програмного забезпечення
- •1.1.3.Складність опису окремих елементів
- •1.2.Парадигма ооп
- •1.3.Історія розвитку ооп
- •Розділ 2 об'єкти й класи: інкапсуляція
- •2.1.Структура об'єкта й класу
- •2.2.Особливості опису класів у мовах ооп
- •2.2.1.Опис класів в SmallTalk
- •2.2.3.Опис класів в Delphi
- •2.2.4.Опис класів в Java
- •2.3.Поля даних та їх ініціалізація
- •2.3.1.Визначення полів даних в SmallTalk
- •2.3.3.Визначення полів даних в Delphi
- •2.3.4.Визначення змінних в Java
- •2.4.Доступ до даних
- •2.4.1.Доступ до даних в SmallTalk
- •2.4.3.Доступ до даних в Delphi
- •2.4.4.Доступ до даних в Java
- •2.5.Спеціальні змінні
- •2.5.1.Спеціальні змінні в SmallTalk
- •2.5.3.Спеціальні змінні в Java
- •2.5.4.Спеціальні змінні в Delphi
- •2.6.Посилання
- •2.6.1.Визначення посилань в SmallTalk, Delphi і Java
- •2.7.Методи
- •2.7.1.Загальна схема визначення методу
- •2.7.2.Визначення методів в SmallTalk
- •2.7.4.Визначення методів в Delphi
- •2.7.5.Визначення методів в Java
- •2.8."Дружні" методи
- •2.8.2.Аналог дружніх функцій в Delphi
- •2.9.Конструктори й деструктори
- •2.9.1.Конструктори й деструктори в SmallTalk
- •2.9.3.Конструктори й деструктори в Delphi
- •2.9.4.Конструктори й деструктори в Java
- •2.10.Властивості
- •2.10.1.Властивості в Delphi
- •2.10.2.Властивості в Java
- •2.12.Абстрактні методи
- •Розділ 3 успадкування
- •3.1.Форми успадкування
- •3.2.Успадкування в SmallTalk
- •3.3.1.Віртуальне успадкування
- •3.3.2.Правило сумісності типів
- •3.3.3.Використання конструкторів і деструкторів при успадкуванні
- •3.4.Успадкування в Delphi
- •3.4.1.Ієрархія класів в Delphi
- •3.4.2.Створення нових компонентів
- •3.5.Успадкування в Java
- •3.5.1.Використання ключового слова super
- •3.5.2.Клас Object
- •Розділ 4 поліморфізм
- •4.1.Віртуальні методи
- •4.2.1.Механізм пізнього зв'язування
- •4.2.2.Таблиця віртуальних методів
- •4.3.Поліморфізм в Delphi
- •4.3.1.Заміщення віртуальних і динамічних методів
- •4.3.2.Приведення типів
- •4.4.Поліморфізм в Java
- •4.5.Поліморфізм в SmallTalk
- •5.1.Потокові класи
- •5.1.1.Ієрархія потокових класів
- •5.1.2.Форматоване введення/ виведення
- •5.1.3.Маніпулятори
- •5.1.4.Введення/виведення у файл
- •5.2.Контейнерні класи
- •5.2.1.Ітератори
- •5.2.2.Визначення контейнерних класів
- •5.2.3.Стандартні контейнерні класи
- •5.3.1.Параметиізовані класи (шаблони)
- •5.3.2.Ітератори stl
- •5.3.3.Узагальнені алгоритми
- •Література
- •Додатки лабораторна робота №1 об'єкти й повідомлення в smalltalk
- •Лабораторна робота №2 класи й методи в smalltalk
- •Листинг 3.1
- •Листинг 3.2
- •Листинг 3.3
- •Лабораторна робота 5 компоненти в delphi
- •Лабораторна робота 6 меню й вікна в delphi
- •Лабораторна робота 7 розробка меню в java
- •Лабораторна робота 8 робота з подіями в java
Розділ 4 поліморфізм
4.1.Віртуальні методи
Поліморфізм буквально означає мати безліч форм (Webster's New Word Dictionary). В ООП під поліморфізмом розуміється здатність об'єктів реагувати на однакові повідомлення згідно з типом об'єктів.
Розглянемо приклад ієрархії класів мовою С++:
class Base {
public:
void f();
}
class A: public Base {
public:
void f();
}
class B: public Base {
public:
void f();
}
Тут всі класи мають однойменну функцію f().
Тепер складемо основну програму:
void main (){
Base * base_ptr[2];
base_ptr[0] = new A;
base_ptr[1] = new B;
for (int i=0; i < 2; i++) base_ptr[i] ( f();
}
Виникає питання: яка функція буде викликатися в циклі? При такому визначенні класів у циклі буде викликатися функція f() класу Base, тому що base_ptr оголошений, як масив покажчиків на клас Base. Подібне зв'язування методів з покажчиками на клас називається статичним або раннім зв'язуванням. Воно встановлюється на етапі компіляції.
Для того, щоб розірвати зв'язок, установлений при раннім зв'язуванні, і забезпечити виклик методів об'єкта на який безпосередньо вказує покажчик, існує механізм віртуальних методів. Оголошення методу віртуальним виконується за допомогою ключового слова virtual, що ставиться перед назвою відповідного методу:
class Base {
public:
virtual void f();
}
class A: public Base {
public:
virtual void f();
}
class B: public Base {
public:
virtual void f();
}
Ключове слово virtual означає, що функція f() може мати різні версії в похідних класах. Але в результаті, зв'язок об'єкта з необхідною версією викликуваного методу буде встановлена не на етапі компіляції, а на етапі виконання програми. Такий зв'язок об'єктів з методами називається динамічним або пізнім зв'язуванням.
4.2.Віртуальні функції в С++
Особливості застосування віртуальних методів у С++ полягають у наступному:
Віртуальні функції не можуть бути оголошені як статичні.
Для віртуальних функцій, що існують у деякій ієрархії, повинні обов'язково збігатися ім'я, число, типи параметрів і типи значень, що повертають.
Функція в похідному класі від базового класу, що має таку ж віртуальну функцію, сама є віртуальною й для неї використання ключового слова virtual є необов'язковим.
Віртуальна функція, обумовлена в базовому класі, не обов'язково повинна перевизначатися в похідному класі, вона буде успадковуватися.
Віртуальна функція не може бути “дружньою функцією”.
Елементом похідного класу може бути функція однойменна, але така, що відрізняється типом або числом параметрів з віртуальною функцією базового класу, але в цьому випадку вона не є віртуальною.
Для забезпечення віртуального виклику об'єкт потрібно оголосити через покажчик або посилання. Без ключового слова virtual динамічний тип змінної (навіть для покажчиків і посилань) ігнорується. Базовий клас повинен бути відкритим.
Віртуальний виклик дозволяє порушити заборону на звертання до методів похідних класів через посилання на базовий клас:
class X {
public:
virtual void f();
};
class Y: public X {
private:
virtual void f();
};
void main () {
Y y;
X * x_ptr=&y;
x_ptr ( f(); // буде викликана функція Y::f()
}