"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора


1.17 Полиморфные Вектора

У вас есть другая возможность - определить ваш векторный и другие
вмещающие классы через указатели на объекты некоторого класса:

class common {
//...
};
class vector {
common** v;
//...
public:
cvector(int);
common*& elem(int);
common*& operator[](int);
//...
};

Заметьте, что поскольку в таких векторах хранятся указатели, а не
сами объекты, объект может быть "в" нескольких таких векторах
одновременно. Это очень полезное свойство подобных вмещающих
классов, таких, как вектора, связанные списки, множества и т.д.
Кроме того, можно присваивать указатель на производный класс
указателю на его базовый класс, поэтому можно использовать
приведенный выше cvector для хранения указателей на объекты всех
производных от common классов. Например:

class apple : public common { /*...*/ }
class orange : public common { /*...*/ }
class apple_vector : public cvector {
public:

cvector fruitbowl(100);
//...
apple aa;
orange oo;
//...
fruitbowl[0] = &aa;
fruitbowl[1] = &oo;
}

Однако, точный тип объекта, вошедшего в такой вмещающий класс,
больше компилятору не известен. Например, в предыдущем примере вы
знаете, что элемент вектора является common, но является он apple
или orange? Обычно точный тип должен впоследствие быть
восстановлен, чтобы обеспечить правильное использование объекта.
Для этого нужно или в какой-то форме хранить информацию о типе в
самом объекте, или обеспечить, чтобы во вмещающий класс помещались