У меня есть иерархия классов, подобная этой:
class Base
{
public:
void start() { init(); }
private:
virtual void init() = 0;
};
class Default : public Base
{
private:
virtual void init() override {/*default implementation*/};
};
class Special : public Default
{
private:
virtual void init() override final {/*specialized implementation*/};
}
, которая работает нормально, если я вызываю start()
для объекта типа Special
;
Теперь у меня есть случай, когдав реализации в классе Special
я хочу вызвать реализацию класса Default
.Обычно это будет работать с Default::init();
, но здесь произойдет сбой из-за объявления Default
этого private
.
Очевидно, что одним из решений является изменение этого значения с private
на protected
,но я хотел бы спросить, есть ли другой способ?Вместо того, чтобы позволить любому потомку вызывать эту функцию напрямую, я бы хотел ограничить это вызовами, которые инициируются через виртуальные функции, уже определенные в классе Base
или Default
.
Есть ли какая-либо опция илимодификатор, который позволял бы разрешать вызовы функций-членов только из дочерних классов, если они находятся внутри (одинаковых) переопределяющих виртуальных функций-членов?