Если я правильно понял вопрос, то я чувствую, что ответ в самом вашем вопросе. :)

я старый добрый 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?

Ответы на вопрос(5)

Ваш ответ на вопрос