У меня есть несколько структур:
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]);
Что я делаю неправильно?
Вы должны использовать 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? поможет вам понять гораздо больше типов приведений.
Значительное использование будет
A &subclassref = vector[0]);
В приведенной выше строке новый объект не создается.
Кстати, каков тип вашего вектора и чего именно вы хотите достичь? Если вы храните объекты типа от A до Z в одном векторе, то в какой-то момент времени это может привести к нарезке объектов.
Этот ответ может быть неправильным, потому что я предполагаю, как вы заполнили 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
).