Syntaxe C ++ concise (mais toujours expressive) pour invoquer les méthodes de classe de base

StackOverflow https://stackoverflow.com/questions/2434632

Question

Je veux invoquer spécifiquement la méthode de la classe de base; Quelle est la façon la plus concise de faire cela? Par exemple:

class Base
{
public:
  bool operator != (Base&);
};

class Child : public Base
{
public:
  bool operator != (Child& child_)
  {
    if(Base::operator!=(child_))  // Is there a more concise syntax than this?
      return true;

    // ... Some other comparisons that Base does not know about ...

    return false;
  }
};
Était-ce utile?

La solution

Non, c'est aussi concis que possible. Base::operator!= est le nom de la méthode.

Et oui, ce que vous faites est standard.

Cependant, dans votre exemple (sauf si vous avez supprimé un code), vous n'avez pas besoin Child::operator!= du tout. Il fait la même chose que Base::operator!= sera.

Autres conseils

1

if ( *((Base*)this) != child_ ) return true;

2

if ( *(static_cast<Base*>(this)) != child_ ) return true;

3

class Base  
{  
public:  
  bool operator != (Base&);  
  Base       & getBase()       { return *this;}
  Base const & getBase() const { return *this;}
}; 

if ( getBase() != child_ ) return true;

Ce que vous faites est la façon la plus concise et la plus "standard" de le faire, mais certaines personnes préfèrent ceci:

class SomeBase
{
public:
    bool operator!=(const SomeBaseClass& other);
};

class SomeObject: public SomeBase
{
    typedef SomeBase base;  // Define alias for base class

public:
    bool operator!=(const SomeObject &other)
    {
        // Use alias
        if (base::operator!=(other))
            return true;

        // ...

        return false;
    }
};

Les avantages de cette méthode sont qu'il clarifie l'intention, il vous donne une abréviation standard pour ce qui pourrait être un nom de classe de base long, et si votre classe de base change, vous n'avez pas à changer chaque utilisation de la base.

Voir En utilisant "Super" dans C ++ pour une discussion supplémentaire.

(Personnellement, je m'en fiche, et je ne le recommande pas, mais je pense que c'est une réponse valide à la question.)

if (condition) return true;
return false;

peut être abrégé à

return condition;

Je me débarrasserais de la structure If / The Control et renvoie simplement la valeur de retour de l'opérateur de classe de base, mais sinon ce que vous faites est bien.

Cela peut être un peu plus concis, cependant: return ((Base&)*this) != child_;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top