Fehler, Irrtümer, Fragen - Seite 1677

 
Sergei Vladimirov:
Ich habe nichts über Eröffnungs- und Schlusskurse geschrieben.
Dann habe ich Sie wohl missverstanden - Entschuldigung.
 

Warum ein Fehler bei privaten Methoden?

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

Warum tritt bei privaten Methoden ein Fehler auf?

Private hat nichts damit zu tun, dass Ihre Funktion als final deklariert ist und Sie versuchen, sie zu überschreiben.

ZS: Ich habe versucht, zu kompilieren - der Compiler sagt, was das Problem ist.

 
Sergei Vladimirov:
Privat hat nichts damit zu tun, dass Sie diese Funktion als endgültig deklarieren.
Es gibt also keine übergeordneten privaten Methoden in einer geerbten Klasse. Deshalb sollte es keine Überschneidungen geben.
 
fxsaber:
Es gibt also keine übergeordneten privaten Methoden in einer geerbten Klasse. Aus diesem Grund sollte es keine Überschreibung geben.
Nun, hallo.
 
Sergei Vladimirov:
Hallo zusammen.
Öffentliches Erbe. Vom Nachkommen sind private Methoden des Elternteils nicht verfügbar, so der Compiler.
 
fxsaber:
Öffentliches Erbe. Die privaten Methoden des Elternteils sind dem Compiler zufolge für den Nachkommen nicht verfügbar.

Eine private virtuelle Methode einer Basisklasse kann nicht von einem Erben aufgerufen werden, aber Sie können sie außer Kraft setzen, was Sie ja gerade versuchen.

 
Sergei Vladimirov:

Eine geschlossene virtuelle Methode einer Basisklasse kann nicht von einem Erben aufgerufen werden, kann aber überschrieben werden.

Danke, das habe ich nicht gewusst. Ich kann mir nicht vorstellen, wo dies nützlich sein könnte. Es ist dem X_Macro sehr ähnlich. Ich werde versuchen, ein ähnliches Beispiel zu erstellen, um ein besseres Verständnis zu bekommen.
 
fxsaber:
Ich werde versuchen, ein ähnliches Beispiel zu machen, um ein besseres Verständnis zu bekommen.

Das ist eine nette Geste.

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);
}

Ich denke, eine solche Konstruktion könnte irgendwo nützlich sein.

 
fxsaber:
öffentliche Vererbung. Dem Compiler zufolge sind die privaten Methoden des Elternteils im Nachkommen nicht verfügbar.
Dies kann verwendet werden, um ein Analogon des Schlüsselworts final zu erstellen, das eine weitere Vererbung ausdrücklich verbietet.