Собственно, сабж. Есть класс, у которого есть виртуальный метод, перезагруженный в потомках. Нужно потомки класса хранить в одном массиве типа родителя.
Если я правильно понял вопрос - то всё просто: Код (C++): class Parent { public: Parent(); virtual ~Parent(); virtual void Method() = 0; }; class Child : public Parent { public: virtual void Method(); }; Parent* array[10] = {NULL}; for(int i=0;i<10;i++) { array[i] = new Child(); }
Vetrinus/ поместить=то в массив - просто, см выше. Но вы, как мне кажется, делаете это для того. чтобы извлекать из массива типа "родитель" экземпляры потомков и применять для каждого потомка его перегруженный метод? - Это у вас так просто не выйдет. Для этого необходимо будет вручную привести каждый элемент массива к своему типу класса потомка. так как по умолчанию элементы массива будут разрешаться в типе родителя.
Чой-то? По указателю на родителя перегруженный виртуальный метод родителя прекрасно вызывается без каста. Если брать как пример мой код, приведённый выше, то чтобы вызвать метод Method у потомка (Child), то достаточно сделать Код (C++): Parent* p = array[5]; p->Method(); Всё. Другое дело, если потомки, вдобавок к имеющимся в VT записям добавляют свои, невиртуальные методы, тогда придётся кастить: Код (C++): class Parent { public: Parent(); virtual ~Parent(); virtual void Method() = 0; }; class Child : public Parent { public: virtual void Method(); void Method2(); }; Parent* array[10] = {NULL}; for(int i=0;i<10;i++) { array[i] = new Child(); } Parent* virtualCall = array[5]; virtualCall->Method(); // канает virtualCall->Method2(); // не канает Child* childCall = (Child*) virtualCall; childCall->Method2(); // канает
Да, я с DIYMan согласен. все потомки совместимы по присваиванию с родителем безо всяких кастов. И вирт.методы вызываются правильные. Для того VMT и придумана.