в него объекты этого класса и класса В (наследник класса А с дополнительными полями и методами) и я хочу проитерироватся по этому вектору и хочу выполнить метод классов В (он есть только у него) то как я могу сделать отсев? пробовал через статик каст, но он почему то и объекты класса А спокойно кастит, и вообще компиль ругает говорит так нельзя
"и добавить в него объект класса B" вы проиграли, смотрите, что такое слайсинг
эта штука вроде называется полиморфизм
Нарушение принципа SOLID Тебе не нужен отдельный публичный метод из класса B, лучше создать виртуальный метод в базовом классе и его вызывать
а лучше вообще не складывать в одну коллекцию объекты разного рантайм типа
Чел с такой аватаркой не может задавать такие вопросы )
Потому что она была у весьма опытного в плюсах )
не достоин другими словами, пойду поставлю чё то другое
Эта штука называется срезка по-русски если ты положишь в контейнер предков объект наследника то он превратится в объект предка
да, через обычный копи-конструктор
Руслан ты можешь переделать это дело в векторе хранить смартпоинтеры на объекты
1. В векторе храни умные указатели на А. Тогда в нем можно будет хранить указатели на любого наследника (они автоматом скастятся к А*). 2. Чтобы вызвать метод, который есть только у наследника, придется для каждого элемента вектора вызывать dynamic_cast к нужному типу. Если этот каст вернет указатель, значит можно через него вызвать нужный метод. Если вернет nullptr, значит очередной "настоящий" класс не тот, к которому кастишь.
Либо можно сделать этот метод полиморфным, virtual, и в классе A
Дэсемь, Ты прямо вот все секреты языка раскрыл....
А если этому методу вот вообще нечего делать в А? Ну типо А - это класс Животное. И надо сложить разных животных в контейнер и заставить тех, кто умеет рычать, прорычать.
Это всё вот пусть товарищ Руслан сам решает это его дело
В некотором смысле такой дизайн объектов вполне допустим типа всем рычать, говоришь рыбе рычать говоришь собаки рычать говоришь пауку рычать, рычит только собака остальные молчат
Можно сделать метод "подай голос", который не чисто виртуальный будет. А в имплементации его в базовом как-то обработать ситуацию "молчаливого животного"?
Например, вызвать std::terminate 😁
Если много наследников и хочется у конкретного отключить унаследованный метод, можно путём void f()override = delete у наследника. Если для всех вырубить надо, то можно воспользоваться в базовом классе сразу такой записью virtual void f() final
А чем это будет отличаться от отсутствия переопределения как такового? И чем второй вариант будет отличаться от virtual void f() = 0?
Ну как минимум при попытке вызова метода будет явная ошибка и не будет ситуации по типу "а че ничего не отображается?"
Ничего не даст если наследник к базе скастовать, один фиг в рантайме упадет, а в релизе еще и с громким звуком
зачеркнул первое, т.к. не работает с виртуальные функциями, забыл чет
> void f()override = delete Если так сделать и в базе f будет чисто виртуальным, то нельзя будет создать объект.
уже ниже написал, да
Обсуждают сегодня