170 похожих чатов

Если есть вектор классов (условно класс - А) и добавить

в него объекты этого класса и класса В (наследник класса А с дополнительными полями и методами) и я хочу проитерироватся по этому вектору и хочу выполнить метод классов В (он есть только у него) то как я могу сделать отсев? пробовал через статик каст, но он почему то и объекты класса А спокойно кастит, и вообще компиль ругает говорит так нельзя

27 ответов

25 просмотров

"и добавить в него объект класса B" вы проиграли, смотрите, что такое слайсинг

rups1k- Автор вопроса

эта штука вроде называется полиморфизм

Нарушение принципа SOLID Тебе не нужен отдельный публичный метод из класса B, лучше создать виртуальный метод в базовом классе и его вызывать

Till Schneider
Нарушение принципа SOLID Тебе не нужен отдельный ...

а лучше вообще не складывать в одну коллекцию объекты разного рантайм типа

Чел с такой аватаркой не может задавать такие вопросы )

rups1k
почему?)

Потому что она была у весьма опытного в плюсах )

rups1k- Автор вопроса
d7d1cd
Потому что она была у весьма опытного в плюсах )

не достоин другими словами, пойду поставлю чё то другое

rups1k
эта штука вроде называется полиморфизм

Эта штука называется срезка по-русски если ты положишь в контейнер предков объект наследника то он превратится в объект предка

rups1k
не достоин другими словами, пойду поставлю чё то д...

Руслан ты можешь переделать это дело в векторе хранить смартпоинтеры на объекты

1. В векторе храни умные указатели на А. Тогда в нем можно будет хранить указатели на любого наследника (они автоматом скастятся к А*). 2. Чтобы вызвать метод, который есть только у наследника, придется для каждого элемента вектора вызывать dynamic_cast к нужному типу. Если этот каст вернет указатель, значит можно через него вызвать нужный метод. Если вернет nullptr, значит очередной "настоящий" класс не тот, к которому кастишь.

d7d1cd
1. В векторе храни умные указатели на А. Тогда в н...

Либо можно сделать этот метод полиморфным, virtual, и в классе A

d7d1cd
1. В векторе храни умные указатели на А. Тогда в н...

Дэсемь, Ты прямо вот все секреты языка раскрыл....

Ilya Zviagin
Либо можно сделать этот метод полиморфным, virtual...

А если этому методу вот вообще нечего делать в А? Ну типо А - это класс Животное. И надо сложить разных животных в контейнер и заставить тех, кто умеет рычать, прорычать.

d7d1cd
А если этому методу вот вообще нечего делать в А? ...

Это всё вот пусть товарищ Руслан сам решает это его дело

В некотором смысле такой дизайн объектов вполне допустим типа всем рычать, говоришь рыбе рычать говоришь собаки рычать говоришь пауку рычать, рычит только собака остальные молчат

Ilya Zviagin
В некотором смысле такой дизайн объектов вполне до...

Можно сделать метод "подай голос", который не чисто виртуальный будет. А в имплементации его в базовом как-то обработать ситуацию "молчаливого животного"?

Андрей Таусинов
Можно сделать метод "подай голос", который не чист...

Если много наследников и хочется у конкретного отключить унаследованный метод, можно путём void f()override = delete у наследника. Если для всех вырубить надо, то можно воспользоваться в базовом классе сразу такой записью virtual void f() final

А чем это будет отличаться от отсутствия переопределения как такового? И чем второй вариант будет отличаться от virtual void f() = 0?

Андрей Таусинов
А чем это будет отличаться от отсутствия переопред...

Ну как минимум при попытке вызова метода будет явная ошибка и не будет ситуации по типу "а че ничего не отображается?"

Stepan Zorin
Ну как минимум при попытке вызова метода будет явн...

Ничего не даст если наследник к базе скастовать, один фиг в рантайме упадет, а в релизе еще и с громким звуком

Stepan Zorin
Если много наследников и хочется у конкретного отк...

зачеркнул первое, т.к. не работает с виртуальные функциями, забыл чет

Stepan Zorin
Если много наследников и хочется у конкретного отк...

> void f()override = delete Если так сделать и в базе f будет чисто виртуальным, то нельзя будет создать объект.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта