вызывать виртуальные методы потомка при упаковке обьектов в контейнер, кроме как класть туда указатели на эти обьекты?
Т.е. чтоб вот такое:
struct T1 {
virtual void test() {
std::cerr << "T1!";
}
};
struct T2 : T1 {
void test() override {
std::cerr << "T2!";
}
};
int main() {
std::vector<T1> vec;
vec.push_back(T2{});
for (auto &t : vec) {
t.test();
}
}
Печатало "T2!"
Не понял вопрос
Давай так : ты формулируешь не свои предположения, а свою задачу.
Есть вектор, хранит тип T1. T2 отнаследован от T1. Когда я закидываю в этот вектор обьекты типа T2 и дергаю у них виртуальный метод, вызывается виртуальный метод родительского класса. Если вектор имеет тип хранимых данных T1* и я закидываю в вектор T2*, то вызывается метод наследника. Могу ли я как-то в первом случае вызвать метод наследника?
Когда ты закидываешь в vector из T1 объект -наследник, он пр-т копировании становится T1
Если хочется хранить объекты разных типов, надо хранить по указателю, T1* или юник на T1
Это я понимаю. Вопрос в том, если что-то более адекватное, чем кидаться везде указателями, но, видимо нет. Печально, спасибо :(
Просто не хочу кидаться указателями / юниками туда-сюда
Типа "я хочу есть, но жевать мне не хочется"
std::variant на все возможные типы наследников, если их количество фиксировано. Или ручная оптимизация в виде small buffer optimization, но для unique_ptr (если очень нужно)
Вариант действительно неплохой вариант. Спасибо, надо потестить
Так он внутри так же по указателю...
Да, я понимаю. Просто кишки наружу не торчат, что скорее
Внутри variant нет указателя и выделения памяти
Стоп, а выделения памяти почему нет? Там не какой-нибудь std::aligned_storage(max(sizeof(T...)))?
Там именно какой-нибудь union-like тип, вмещающий в себя любой из перечисленных типов
Обсуждают сегодня