Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_KAZYMYR.doc
Скачиваний:
13
Добавлен:
09.11.2019
Размер:
3.71 Mб
Скачать

3.2.Успадкування в SmallTalk

Особливості успадкування в SmallTalk полягають у наступному:

  1. S mallTalk підтримує тільки просте успадкування. Вся ієрархія будується від одного класу Object (рис. 3.3).

Рис. 3.3. Ієрархія класів в SmallTalk

  1. В SmallTalk існує дві паралельні ієрархії класів: ієрархія класів і ієрархія метакласів, зв'язок між якими показана на рис. 3.4.

Рис. 3.4. Зв'язок ієрархій класів і метакласів: пунктірною лінією показане відношення між класами типу «клас а є екземпляром класу в», суцільною лінією – «клас а є підкласом класу в»

  1. Кожний підклас успадковує змінні класу, змінні екземпляра й методи суперкласу. У результаті виходить так, що якщо базовий клас має два змінні класи A і B, два змінні екземпляри x і y а підклас два змінні класи C і D, два змінні екземпляри z і s, те в екземплярі підкласу доступні змінні A, B, C, D, x, y, z, s У зв'язку із цим імена змінних у підкласах повинні відрізнятися від імен у суперкласах. Приклад опису класу і його підкласу наведений нижче.

Object subclass: #OneClass

instanceVariableNames: 'x y'

classVariableNames: 'A B'

…………………………

OneClass subclass: #TwoClass

instanceVariableNames: 'z s'

classVariableNames: 'C D'

  1. На відміну від механізму успадкування змінних підклас може містити методи, однойменні з методами суперкласу. У цьому випадку відбувається перевизначення методів суперкласу. Для виклику методів суперкласу потрібно використати змінну super.

  2. Не всі методи SmallTalk реалізуються за допомогою мови. Деякі реалізуються за допомогою примітивів базової віртуальної машини SmallTalk.

3.3.Успадкування в С++

Можливості успадкування в С++ значно більші, ніж в SmallTalk. Насамперед, це пов'язане з тим, що в С++ явно підтримуються обидва способи успадкування: просте й множинне. Даний факт виражається в тім, що при описі похідного класу (підкласу) може вказуватися цілий список успадкованих (базових) класів (перерахування базових класів робиться після двокрапки відразу за ім'ям похідного класу:

сlass D: A, B, C {...……………}; //клас D успадковує класи A, B і З

Інші особливості успадкування в С++ полягають у наступному:

  1. Базові класи можуть бути визначені зі специфікаторами доступу public і private:

сlass X: public Y {...…………......};

сlass Z: private Y {...…………......};

За замовчуванням базовий клас визначається, як private, а базова структура, як public:

class Y: B, public C {...…}; // клас В - private, клас ІЗ - public

struct S: private D, E {...…}; // клас D - клас private, клас E - public

  1. Використовуючи специфікатори доступу, можна перевизначити правила доступу до класу відповідно до правил, наведених в табл. 3.1.

Таблиця 3.1

Правила доступу до елементів класу при успадкуванні

Доступ у базовому класі

Специфікатор доступу

Доступ у похідному класі

public

public

public

private

public

немає доступу

protected

public

protected

public

private

private

private

private

немає доступу

protected

private

private

Таким чином, специфікатор рublic залишає доступ до змінних базового класу без зміни, за винятком змінних private, які недоступні в похідному класі в кожному разі. Специфікатор private робить всі змінні похідного класу private, але змінні базового класу однаково не будуть доступні похідному класу.

Дії окремих специфікаторів доступу можна скорегувати, наприклад, у такий спосіб:

сlass B { int a;

public:

int b, c;

………………};

class A: B { int d; // клас B - private

public:

B::c; // змінна c була private, а стала public

………………};

  1. За допомогою кваліфікатора “::” можна звернутися до однойменних змінних базового й похідного класів. Таким чином, у похідних класах можуть бути використані змінні, однойменні зі змінними базових класів:

int y;

X::y=y;