Если я правильно понял вопрос, то я чувствую, что ответ в самом вашем вопросе. :)
я старый добрый CRPT (пожалуйста, не отвлекайтесь на ограничения доступа - вопрос не о них):
template<class Derived>
class Base {
void MethodToOverride()
{
// generic stuff here
}
void ProblematicMethod()
{
static_cast<Derived*>(this)->MethodToOverride();
}
};
это, как обычно, предназначено для использования так:
class ConcreteDerived : public Base<ConcreteDerived> {
void MethodToOverride()
{
//custom stuff here, then maybe
Base::MethodToOverride();
}
};
Теперь, когдаstatic_cast
Меня беспокоит. Мне нужен downcast (не upcast), поэтому я должен использовать явное приведение. Во всех разумных случаях приведение будет действительным, поскольку текущий объект действительно является производным классом.
Но что, если я каким-то образом изменю иерархию и состав актеров станет недействительным?
Могу ли я как-то принудительно проверить проверку во время компиляции, что в этом случае действителен явный downcast?