43 votes

Rendre l'opérateur << virtuel ?

J'ai besoin d'utiliser un opérateur virtuel <<. Cependant, lorsque j'essaie d'écrire :

 virtual friend ostream & operator<<(ostream& os,const Advertising& add);

j'obtiens l'erreur du compilateur

Erreur 1 erreur C2575 : 'opérateur <<' : seules les fonctions membres et les bases peuvent être virtuel

Comment puis-je rendre cet opérateur virtuel ?

37voto

Loki Astari Points 116129

Vous définissez votre opérateur << pour appeler une méthode d'impression virtuelle :

 class Base
{
    protected:
        virtual void print(std::ostream& str) const = 0;
    public:
        friend std::ostream& operator<<(std::ostream& str, Base const& data)
        {
            data.print(str);
            return str;
        }
}

3voto

birryree Points 29165

Il semble que vous souhaitiez vraiment fournir une fonctionnalité de sortie pour une hiérarchie de classes, et si c'est le cas, vous pouvez fournir un friend operator << qui appelle une fonction virtual .

 class Parent
{
public:
    friend std::ostream& operator<< (std::ostream& os, const Parent& p);
    // ... other class stuff
protected:
    virtual void printMyself(std::ostream& os) const
    {
        // do something if you must, or make this a pure virtual
    }
};

std::ostream& operator<< (std::ostream& os, const Parent& p)
{
    p.printMyself(os);
    return os;
}

class Child : public Parent
{
    // other class stuff...
protected:
    virtual void printMyself(std::ostream os) const
    {
        // whatever you need to do
    }
};

Également détaillé dans la FAQ C++

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X