Бази c полиморфизм - PullRequest
       5

Бази c полиморфизм

1 голос
/ 06 апреля 2020

У меня есть две структуры:

struct X { double x; };

struct Y : X { double y; };

Я хочу вектор, заполненный базовыми c объектами (типа X), которые возможно могут быть расширены (до объектов типа Y):

    std::vector<X*> vec;

    if(condition)
    {
        for(size_t i=0; i<n; ++i)
        {
            vec.push_back(new Y);
            vec[i]->x = ...;
            vec[i]->y = ...; // error
        }
    }
    else
    {
        for(size_t i=0; i<n; ++i)
        {
            vec.push_back(new X);
            vec[i]->x = ...;
        }
    }

Это выдает ошибку "нет члена с именем 'y' в 'X'". Знаете ли вы, как я мог достичь того, что я sh?

1 Ответ

1 голос
/ 06 апреля 2020

Быстрое решение для кода, который вы опубликовали до сих пор. Измените

vec.push_back(new Y);
vec[i]->x = ...;
vec[i]->y = ...; // error

на

Y* newy = new Y;
vec.push_back(newy);
newy->x = ...;
newy->y = ...; // no error

Но тогда вам все равно понадобится приведение X * к Y * при чтении объекта обратно для доступа к переменным-членам, содержащимся только в Y.

if(condition)
    cout << static_cast<Y*>(vec[i])->y;

Вместо приведений можно также создать отдельные векторы для X и Y (указатели не обязательно должны быть, если они содержат только один тип, но также могут быть указатели) и просто заполнить и получить доступ к одному из них.

vector<X> vecX;
vector<Y> vecY;
bool condition;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...