поліморфні Вектора h2>
У вас є інша можливість - визначити ваш векторний
та інші вміщають класи через покажчики на об'єкти деякого класу: p>
class common ( p>
//... p>
); p>
class vector ( p>
common ** v; p>
//... p>
public: p>
cvector (int); p>
common * &
elem (int); p>
common * & operator [] (int); p>
//... p>
); p>
Зауважте, що оскільки в таких векторах зберігаються
покажчики, а не самі об'єкти, об'єкт може бути "в" декількох таких
векторах одночасно. Це дуже корисна властивість подібних вміщають класів,
таких, як вектора, зв'язані списки, множини і т.д. Крім того, можна
привласнювати покажчик на похідний клас вказівником на його базовий клас,
тому можна використовувати наведений вище cvector для зберігання покажчиків на
об'єкти всіх похідних від common класів. p>
Наприклад:
p>
class apple: public common (/*...*/) p>
class orange: public common (/*...*/) p>
class apple_vector: public cvector ( p>
public: p>
cvector fruitbowl (100); p>
//... p>
apple aa; p>
orange oo; p>
//... p>
fruitbowl [0] = &aa; p>
fruitbowl [1] = &oo; p>
) p>
Проте, точний тип об'єкта, який увійшов в такій вміщає
клас, більше компілятору не відомий. Наприклад, у попередньому прикладі ви
знаєте, що елемент вектора є common, але є він apple або orange?
Звичайно точний тип повинен в наслідок бути відновлений, щоб забезпечити
правильне використання об'єкта. Для цього потрібно або в якійсь формі зберігати
інформацію про тип в самому об'єкті, або забезпечити, щоб під вміщає клас
містилися тільки об'єкти даного типу. Остання легко досягається за допомогою
похідного класу. Ви можете, наприклад, створити вектор вказівників на apple: p>
class apple_vector: public cvector ( p>
public: p>
apple * &
elem (int i) p>
(return
(apple * &) cvector:: elem (i);) p>
//... p>
); p>
використовуючи запис приведення до типу (тип) вираз, щоб
перетворити common * & (посилання на покажчик на common), яку повертає
cvector:: elem, в apple * &. Таке застосування похідних класів створює
альтернативу узагальненим класами. Писати його трохи важче (якщо не використовувати
макроси таким чином, щоб похідні класи фактично реалізовували
узагальнені класи, але воно має ту перевагу, що всі похідні класи
спільно використовують єдину копію функції базового класу. У разі
узагальнених класів, таких, як vector (type), для кожного нового використовуваного
типу повинна створюватися (за допомогою implement ()) нова копія таких функцій.
Інший спосіб, зберігання ідентифікації типу в кожному об'єкті, приводить нас до
стилю програмування, який часто називають об'єкти-заснованим або
об'єктно-орієнтованим. p>
Список літератури h2>
Для підготовки даної роботи були використані матеріали
з сайту http://www.realcoding.net
p>