Додавання до Класу h2>
У попередніх прикладах похідний клас нічого не
додавав до базового класу. Для похідного класу функції визначалися тільки
щоб забезпечити перетворення типу. Кожен похідний клас просто ставив
альтернативний інтерфейс до загального безлічі програм. Цей спеціальний випадок
важливий, але найбільш звичайна причина визначення нових класів як похідних
класів в тому, що хтось хоче мати те, що надає базовий клас, плюс
еще чуть-чуть. p>
Для похідного класу можна визначити характеристики та функції
додатково до тих, які успадковуються з його базового класу. Це дає
альтернативну стратегію забезпечити кошти пов'язаного списку. Зауважте, коли
в той slist, який визначався вище, міститься елемент, то створюється slink,
що містить два покажчика. На їхнє створення витрачається час, але ж без одного з
покажчиків можна обійтися, за умови, що потрібно тільки щоб об'єкт міг
перебувати в одному списку. Так що вказівник next на наступний можна помістити
в сам об'єкт, замість того, щоб вміщувати його в окремий об'єкт slink. Ідея
полягає в тому, щоб створити клас olink з єдиним полем next, і клас
olist, який може обробляти покажчиками на такі ланки olink. Тоді olist
зможе маніпулювати об'єктами будь-якого класу, похідного від olink. Буква
"o" у назвах варто для того, щоб нагадувати вам, що об'єкт
може перебувати одночасно лише в одному списку olist: p>
struct olink ( p>
olink * next; p>
); p>
Клас olist дуже нагадує клас slist. Відмінність полягає
в тому, що користувач класу olist маніпулює об'єктами класу olink
безпосередньо: p>
class olist ( p>
olink * last; p>
public: p>
void
insert (olink * p); p>
void
append (olink * p); p>
olink * get (); p>
// ... p>
); p>
Ми можемо вивести з класу olink клас name: p>
class name: public olink ( p>
// ... p>
); p>
Тепер легко зробити список, який можна використовувати
без накладних витрат часу на розміщення або пам'яті. p>
Об'єкти, помещаеми в olist, втрачають свій тип. Це
означає, що компілятор знає тільки те, що вони olink "і. Правильний тип
можна відновити за допомогою явного перетворення типу об'єктів, вийнятих з
olist. p>
Наприклад:
p>
void f () p>
( p>
olist ll; p>
name nn; p>
ll.insert (& nn);
//Тип & nn втрачено p>
name * pn = (name *) ll.get ();// і відновлений p>
) p>
Інший спосіб: тип можна відновити, вивівши ще один
клас з olist для обробки перетворення типу: p>
class olist: public olist ( p>
// ... p>
name * get () (
return (name *) olist:: get ();) p>
); p>
Назва name може одночасно перебувати лише в одному
olist. Для імен це може бути і не підходить, але в класах, для яких це
підійде повністю, не бракує. Наприклад, клас фігур shape використовує для
підтримки списку всіх фігур саме цей метод. Зверніть увагу, що можна
було б визначити slist як похідний від olist, поєднуючи таким чином обидва
поняття. Проте використання базових і похідних класів на такому
мікроскопічному рівні може дуже сильно спотворити код. p>
Список літератури h2>
Для підготовки даної роботи були використані матеріали
з сайту http://www.realcoding.net
p>