Да, вы можете сделать это, это хорошая практика, которая, однако, должна решительно рассматриваться в отношении ситуации.
Два примера:
Будьте осторожны, чтобы не вызывать методы в конструкторе класса: во время вызова ваш класс частично инициализируется, поэтому любой вызов методов (самого класса или унаследованных) может иметь плохие и трудные для отслеживания последствия. Как правило, конструктор должен быть «самодовольным» по отношению к классу.
Поскольку вы используете методы класса, у вас есть свободный доступ к его реализации. Задайте себе вопрос: «Хочу ли я получить доступ к классу через его интерфейс или через его реализацию?».
Чтобы лучше объяснить второй пункт, предположим, что у вас есть класс A с методами foo () и bar ().
Предположим, что foo () вызывает bar () в своем коде. В этом случае вы говорите с интерфейсом вашего объекта. Этот интерфейс не может быть тем, который вы ожидаете! Например, предположим, что класс был переопределен (класс B, производный от A) вами, а также пользователем вашего кода, и этот метод bar () был переопределен. Из-за наследования A :: foo () будет вызывать B :: bar () вместо A :: bar ().
Не используя вызов метода bar () и получая доступ к реализации , вы гарантируете, что ваша функция ведет себя одинаково даже для дочерних классов.
Некоторые из этих проблем входят в так называемую проблему хрупкого базового класса . Вот очень хорошая статья об этом.