Ответ , это зависит .
Я не вижу смысла в необходимости загромождать ваш базовый интерфейс с fill/get_fillable_instance/...
, если не каждый объект должен обрабатывать заполнение.Однако вы можете обойтись просто с помощью
struct slide_object
{
virtual void fill() {} // default is to do nothing
};
, но это зависит от того, считаете ли вы, что fill
должен появиться в абстрактном классе объекта слайда.Однако это редко следует делать, если исключение не заполняется, что является исключительным.
Динамическое приведение может быть правильным в том случае, если вам нужно предоставить два различных класса объектов (и не более двух), некоторые из них можно заполнить, идругой не имеет ничего общего с заполняемостью.В этом случае имеет смысл иметь две подчиненные иерархии и использовать динамическое приведение там, где вам нужно.
В некоторых случаях я успешно использовал этот подход, и он прост и удобен в обслуживании, если логика диспетчеризации не рассеяна.(т.е. есть только одно или два места, где вы динамически применяете).
Если ожидается, что у вас будет более похожее на заливку поведение, тогда dynamic_cast
- неправильный выбор, поскольку он приведет к
if (auto* p = dynamic_cast<fillable*>(x))
...
else if (auto* p = dynamic_cast<quxable*>(x))
...
что плохо.Если вам это понадобится, реализуйте шаблон Visitor.