Я пытаюсь назначить производные объекты вектору базовых объектов, а затем отбрасывать их обратно на производные объекты. Однако я не могу сделать бросок.динамическое литье базы на производные объекты
struct Base
{
string foo;
virtual ~Base() {}
};
struct Derived : Base
{
string bar;
};
У меня есть функция, которая изменяет вектор базовых элементов. В зависимости от некоторых условий, он может создать производный объект вместо базового объекта и нажать, что на вектор:
void foo(vector<Base> &bases)
{
Base *base;
if (...)
{
base = new Derived;
base->foo = string("hello");
}
bases.push_back(*base)
}
Тогда я прохожу в векторе к этой функции и попытаться получить его содержимое.
vector<Base> bases;
foo(bases);
for (auto it = bases.begin(); it != bases.end(); ++it)
{
Base *base = &(*it);
Derived *derived = dynamic_cast<Derived*>(base);
// derived == nullptr
}
Что мне здесь не хватает? Если я пытаюсь получить доступ к foo
в качестве базового объекта, он работает, но когда я пытаюсь динамически преобразовать объект Derived, он терпит неудачу, несмотря на то, что был создан как объект Derived в функции foo(vector<Base> &bases)
.
См. Раздел «Нарезка объектов». – chris
Вы не можете использовать 'vector ', вы в конечном итоге срезаете объекты 'Derived', которые вы вставляете в него. Вместо этого используйте 'vector >'. –
Praetorian