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

 
Sergei Vladimirov:
Я ничего не писал про цены открытия и закрытия.
Значит я не так Вас понял - извините.
 

Почему ошибка для private-методов?

class CFoo
  {
   private:
   void virtual func(int x) final { }
  };
 
class CBar : public CFoo
  {
   void func(int) { }
  };
 
fxsaber:

Почему ошибка для private-методов?

private не при чём, у вас эта функция как final объявлена, а вы её переопределить пытаетесь.

ЗЫ. Попробовал скомпилировать - компилятор же пишет, в чём проблема. 

 
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, прямой запрет дальнейшего наследования.
Причина обращения: