Статья: Полиморфные Вектора

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

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? Обычно точный тип должен в последствие быть восстановлен, чтобы обеспечить правильное использование объекта. Для этого нужно или в какой-то форме хранить информацию о типе в самом объекте, или обеспечить, чтобы во вмещающий класс помещались только объекты данного типа. Последнее легко достигается с помощью производного класса. Вы можете, например, создать вектор указателей на apple:

class apple_vector : public cvector {

--> ЧИТАТЬ ПОЛНОСТЬЮ <--

К-во Просмотров: 160
Бесплатно скачать Статья: Полиморфные Вектора