Возможный дубликат:
Overriding parent class’s functionКак вызвать виртуальную функцию объекта в C++
я борюсь с вызовом виртуальной функции в C++.
У меня нет опыта работы на C++, я в основном использую C# и Java, поэтому у меня могут быть некоторые заблуждения, но неся со мной.
Мне нужно написать программу, в которой я должен избегать динамического распределения памяти, если это возможно. Я сделал класс под названием List:
template <class T> class List {
public:
T items[maxListLength];
int length;
List() {
length = 0;
}
T get(int i) const {
if (i >= 0 && i < length) {
return items[i];
} else {
throw "Out of range!";
}
};
// set the value of an already existing element
void set(int i, T p) {
if (i >= 0 && i < length) {
items[i] = p;
} else {
throw "Out of range!";
}
}
// returns the index of the element
int add(T p) {
if (length >= maxListLength) {
throw "Too many points!";
}
items[length] = p;
return length++;
}
// removes and returns the last element;
T pop() {
if (length > 0) {
return items[--length];
} else {
throw "There is no element to remove!";
}
}
};
Он просто делает массив данного типа, и управляет длиной этого.
Там нет необходимости для динамического распределения памяти, я могу просто написать:
List<Object> objects;
MyObject obj;
objects.add(obj);
MyObject наследует форму объекта. Объект имеет виртуальную функцию, которая, как предполагается, должен быть переопределен в MyObject:
struct Object {
virtual float method(const Input& input) {
return 0.0f;
}
};
struct MyObject: public Object {
virtual float method(const Input& input) {
return 1.0f;
}
};
я получаю элементы, как:
objects.get(0).method(asdf);
Проблема заключается в том, что даже если первый элемент является MyObject, метод объекта вызывается функция. Я предполагаю, что что-то не так с сохранением объекта в массиве объектов без динамического выделения памяти для MyObject, но я не уверен.
Есть ли способ вызвать функцию метода MyObject? Как? Предполагается, что это гетерогенная коллекция btw, поэтому именно поэтому наследование существует.
Если нет способа вызвать функцию метода MyObject, то как мне сделать свой список в первую очередь?
Также у меня нет доступа к библиотекам за пределами math.h и stdlib.h, поэтому вектор недоступен, например.
Нарезка объектов всегда весело. Вам нужен список указателей. – chris
http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c для какой резки – Mat