АДТ и полиморфизм - PullRequest
       65

АДТ и полиморфизм

0 голосов
/ 10 апреля 2019

Итак, у меня есть этот код:

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;

Моя цель: я хочу, чтобы этот массив содержал правильный объект, если он задан в основной программе, но он содержит только сторону базового класса. Как мне сказать компилятору вставить даже производную сторону ?? Спасибо!

1 Ответ

0 голосов
/ 10 апреля 2019

Ваш код примечание вполне соответствует между типом 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;
}

Онлайн-демонстрация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...