пример с различными животинками и звуки которые они издают. Есть базовый класс креатуре, который содержит в себе юник_птр на саунди, который является интерфейсом для издавания звуков. От него наследуем коровок, кошечек, для них делаем отдельные кау_саунди, кэт_саунди. И тут у меня возник вопрос, я не хочу чтоб когда пользователь создавал базовое креатуре, он мог в него пихнуть интерфейс для кошачьих и коровьих звуков, и при этом я хочу достаточно жёстко залочить что котята и коровки в конструкторах у себя передают именно свои интерфейсы, без возможности вмешаться пользователю. Поэтому решил сделать базовый конструктор креатуре публичным без возможности передачи интерфейса звука, а для наследников которым нужно передавать свои интерфейсы, сделал протектед конструктор. Насколько это вообще валидная тема? Или по рукам надо за такое бить?
а как использовать для инициализации объекта чисто виртуальный класс
Creature - это тварь по-русски.
Ну ... creature(std::string const& name) : name_ { std::move(name) }, зачем ты пишешь то, что не понимаешь ?
Тут проблема чисто создания нужного soundee, ты её тут никак не решаешь. Это надо какие-то creational patterns из GoF использовать чтобы гарантированно создавать у нужной твари нужный звук.
сложно даже что-то сказать ещё , тут главное - зачем строить 2 параллельные иерархии классов, когда "издавание звука" - это и так "свойство" живой твари. Зачем его выдёргивать из иерархии классов живых тварей ?
А если мы захотим выводить звук твари в разные места? Например файл, или вовсе в звуковой интерфейс
В каждом наследнике оверрайдить шаблонную функцию в параметры которой мы будем передавать интерфейс вывода звука?
С точки зрения ООП вопрос это сложный, с точки зрения С++ тут вопроса нет вообще
При чём тут шаблонные функции ?
А как мы тогда иначе будем передавать интерфейс куда надо выводить звук?
Вот и делай интерфейсы вывода звука и передавай его своим тварям
Обсуждают сегодня