Итак, у меня есть этот код:
bool array::InputArray(const ObjectPtr& obj) {
if (full()) return false;
if (!duplicate(vet)) throw exception("\nImportant exception");
obj->input(cin);
arr[nelem]=obj;
nelem++;
return true;
}
obj->input(cin)
— это просто функция полиморфа, позволяющая вводить данные из консоли для точного производного класса, основная программа дает правильный объект, так что виртуальная функция не является проблемой, но arr[nelem]=obj;
есть, также «arr» определяется как:
object* arr;
Моя цель: я хочу, чтобы этот массив содержал правильный объект, когда он задан в основной программе, но он содержит только сторону базового класса. Как мне сказать компилятору вставить даже производную сторону?? Спасибо!
Обратите внимание, что ваш код вполне соответствует типу obj
и типу arr
. Тем не менее, судя по симптомам, ваша проблема связана с нарезка объекта:
arr[nelem]=obj;
Потому что, согласно вашему определению arr
, здесь arr[nelem]
будет типа object
, который является базовым классом. Таким образом, каким бы ни был реальный производный тип obj
, он будет преобразован обратно в базовый класс (и, следовательно, использовать виртуальные функции базового класса).
Если вы хотите иметь полиморфный контейнер, вам нужен контейнер указателей или, что еще лучше, умных указателей. И вместо массивов вам действительно стоит подумать об использовании векторов:
std::vector<std::shared_ptr<Object>> arr;
bool array::InputArray(std::shared_ptr<Object> obj) {
...
obj->input(cin);
arr.push_back(obj); // no need for nelem. Use arr.size() instead
return true;
}
Как было объявлено
input()
в базовом классе? Опубликуйте минимальный воспроизводимый пример, который воспроизводит вашу проблему, как требуется здесь, пожалуйста.