Ошибки, баги, вопросы - страница 1677

 
Sergei Vladimirov:
private не при чём, у вас же эта функция как final объявлена.
Так в наследуемом классе нет же private-методов родителя. Поэтому и переопределения, вроде, как и не должно быть.
 
fxsaber:
Так в наследуемом классе нет же private-методов родителя. Поэтому и переопределения, вроде, как и не должно быть.
Здрасьте-приехали.
 
Sergei Vladimirov:
Здрасьте-приехали.
public-наследование же. Из потомка private-методы родителя не доступны, если верить компилятору.
 
fxsaber:
public-наследование же. Из потомка private-методы родителя не доступны, если верить компилятору.

Закрытый виртуальный метод базового класса нельзя вызвать из наследника, но переопределить - можно, что вы и пытаетесь сделать.

 
Sergei Vladimirov:

Закрытый виртуальный метод базового класса нельзя вызвать из наследника, но можно переопределить.

Спасибо, не знал. Что-то не могу придумать, где такое могло бы быть полезно. На X_Macro это очень похоже. Попробую подобный пример составить, чтобы лучше понять.
 
fxsaber:
Попробую подобный пример составить, чтобы лучше понять.

Прикольно получилось

class BASE
{
private:
  void virtual Func() { Print(__FUNCSIG__); }
public:
  void Init() {Func();}
};

class CHILD : public BASE
{
private:
  virtual void Func() { Print(__FUNCSIG__); }
};

void OnStart()
{
  BASE* Base = new CHILD;
  
  Base.Init();
  
  delete(Base);
}

наверное, такая конструкция может где-то пригодиться. 

 
fxsaber:
public-наследование же. Из потомка private-методы родителя не доступны, если верить компилятору.
С помощью этого можно сделать аналог ключевого слова final, прямой запрет дальнейшего наследования.
 
Комбинатор:
С помощью этого можно сделать аналог ключевого слова final, прямой запрет дальнейшего наследования.
Да вот как показывает пример выше, нельзя аналог сделать. Нужно final прописывать даже для private-методов.
 
fxsaber:
Да вот как показывает пример выше, нельзя аналог сделать. Нужно final прописывать даже для private-методов.

Странно. для public наследования максимальный доступ должен быть protected а не private.

А в примере функция точно перегружается?

 
Комбинатор:

Странно. для public наследования максимальный доступ должен быть protected а не private.

А в примере функция точно перегружается?

Точно. Сам вот только узнал.

Если в примере сделать

BASE() {Func();} // вместо void Init() {Func();} Вызов Base.Init() - убрать конечно.

то можно проверить себя после запуска, правильно ли понимаете, что должно происходить.