Errori, bug, domande - pagina 1677

 
Sergei Vladimirov:
Non ho scritto nulla sui prezzi di apertura e di chiusura.
Allora devo averti frainteso - scusa.
 

Perché un errore per i metodi privati?

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

Perché c'è un errore per i metodi privati?

Private non c'entra niente, la tua funzione è dichiarata come finale e tu stai cercando di sovrascriverla.

ZS. Ho provato a compilare - il compilatore dice qual è il problema.

 
Sergei Vladimirov:
Private non ha niente a che fare con questo, dichiarate questa funzione come finale.
Quindi non ci sono metodi privati dei genitori in una classe ereditata. Ecco perché non ci dovrebbe essere alcun override.
 
fxsaber:
Quindi non ci sono metodi privati dei genitori in una classe ereditata. Ecco perché non ci dovrebbe essere alcun override.
Bene, salve.
 
Sergei Vladimirov:
Ciao a tutti.
Eredità pubblica. Dal discendente i metodi privati del genitore non sono disponibili, secondo il compilatore.
 
fxsaber:
Eredità pubblica. I metodi privati del genitore non sono disponibili dal discendente, secondo il compilatore.

Un metodo virtuale privato di una classe base non può essere chiamato da un erede, ma potete sovrascriverlo, che è quello che state cercando di fare.

 
Sergei Vladimirov:

Un metodo virtuale chiuso di una classe base non può essere chiamato da un erede, ma può essere sovrascritto.

Grazie, non lo sapevo. Non riesco a pensare a dove questo potrebbe essere utile. È molto simile a X_Macro. Cercherò di mettere insieme un esempio simile per capire meglio.
 
fxsaber:
Cercherò di fare un esempio simile per capire meglio.

Questo è un bel tocco.

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

Immagino che una tale costruzione possa tornare utile da qualche parte.

 
fxsaber:
eredità pubblica. I metodi privati del genitore non sono disponibili dal discendente, secondo il compilatore.
Questo può essere usato per fare un analogo della parola chiave finale, proibendo esplicitamente un'ulteriore ereditarietà.