наследование — необработанное исключение — программа c ++ останавливается при приведении

У меня есть несколько структур:

struct Token
{
//some content
}

Then follows a bunch of structs that inherit from Token:
struct A : public Token{
//Stuff
}

.
.
.
struct Z : public Token{
//Other stuff
}

У меня есть вектор std :: vector, заполненный подклассами от A до Z, и моя программа падает, когда я пытаюсь привести любой элемент вектора в подкласс. Я использую следующее:

A subclass = *((A * ) &vector[0]);

Что я делаю неправильно?

0

Решение

Вы должны использовать dynamic_cast при приведении указателей от одного типа к другому в вашем случае использования.
Тот, который вы используете, является C style cast и я настоятельно рекомендую вам пойти с dynamic_cast,
Так что ваш код должен выглядеть примерно так:

if(dynamic_cast<A *>(vector[0]))
A subclass = *(dynamic_cast<A *>(vector[0]));

Когда dynamic_cast не сможет вернуть NULL указатель, и вы должны позаботиться об этом соответствующим образом.
обращаться dynamic_cast и static_cast в C ++ для дополнительной информации.
Дополнительно Когда следует использовать static_cast, dynamic_cast, const_cast и reinterpret_cast? поможет вам понять гораздо больше типов приведений.

1

Другие решения

Значительное использование будет

A &subclassref = vector[0]);

В приведенной выше строке новый объект не создается.

Кстати, каков тип вашего вектора и чего именно вы хотите достичь? Если вы храните объекты типа от A до Z в одном векторе, то в какой-то момент времени это может привести к нарезке объектов.

1

Этот ответ может быть неправильным, потому что я предполагаю, как вы заполнили std::vector<>,

Вы просто не можете поместить объекты подклассов в std::vector<Base>, Все объекты в std::vector<Base> точно типа Base, Если вы попробуете что-то вроде этого:

std::vector<Base> myVec;
myVec.push_back(Derived1(...));

вы сначала создаете объект класса Derived1 который впоследствии склеивается в объект класса Base, я. е. новый объект класса Base копируется из производного объекта. Только этот объект, созданный на основе базового класса, заканчивается в std::vector<>,

Если вы хотите иметь std::vector<> полиморфных объектов, вы должны использовать тип указателя в качестве аргумента шаблона (и, следовательно, выделять содержащиеся объекты с new).

1
По вопросам рекламы [email protected]