Erreurs, bugs, questions - page 1677

 

Pourquoi une erreur pour les méthodes privées ?

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

Pourquoi y a-t-il une erreur pour les méthodes privées ?

Private n'a rien à voir avec cela, votre fonction est déclarée comme finale et vous essayez de la remplacer.

ZS. J'ai essayé de compiler - le compilateur dit quel est le problème.

 
Sergei Vladimirov:
Private n'a rien à voir avec cela, vous déclarez cette fonction comme finale.
Il n'y a donc pas de méthodes privées parentales dans une classe héritée. C'est pourquoi il ne devrait pas y avoir de surcharge.
 
fxsaber:
Il n'y a donc pas de méthodes privées parentes dans une classe héritée. C'est pourquoi il ne devrait pas y avoir de surcharge.
Eh bien, bonjour.
 
Sergei Vladimirov:
Bonjour.
Héritage public. Pour le descendant, les méthodes privées du parent ne sont pas disponibles, selon le compilateur.
 
fxsaber:
Héritage public. Les méthodes privées du parent ne sont pas disponibles chez le descendant, selon le compilateur.

Une méthode virtuelle privée d'une classe de base ne peut pas être appelée par un héritier, mais vous pouvez la surcharger, ce que vous essayez de faire.

 
Sergei Vladimirov:

Une méthode virtuelle fermée d'une classe de base ne peut pas être appelée par un héritier, mais peut être surchargée.

Merci, je ne le savais pas. Je ne vois pas où cela pourrait être utile. C'est très similaire à X_Macro. Je vais essayer de mettre en place un exemple similaire pour mieux comprendre.
 
fxsaber:
Je vais essayer de faire un exemple similaire pour mieux comprendre.

C'est une belle touche.

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

Je suppose qu'une telle construction pourrait être utile quelque part.

 
fxsaber:
l'héritage public. Les méthodes privées du parent ne sont pas disponibles chez le descendant, selon le compilateur.
Ceci peut être utilisé pour faire un analogue du mot-clé final, interdisant explicitement tout héritage supplémentaire.
 
Комбинатор:
Vous pouvez l'utiliser pour créer un analogue du mot clé final, interdisant explicitement tout héritage supplémentaire.
Mais comme le montre l'exemple ci-dessus, on ne peut pas faire d'analogie. Vous devez spécifier final même pour les méthodes privées.