3 votes

Mise en œuvre de fonctions virtuelles pures à partir d'un modèle de classe - types de paramètres

Je souhaite créer un modèle de classe abstraite, obligeant toutes les instances à implémenter une fonction doStuff à l'aide d'une fonction virtuelle pure.

J'ai le modèle suivant :

template<class T>
class X
{
    public:
        X() {};
        virtual ~X() {};
        virtual X<T>& doStuff(X<T>& x) = 0;
};

Et une instance avec T= int :

class Y : public X<int>
{
    public:
        Y();
        virtual ~Y();
        Y& doStuff(Y& x) {
            Y res;
            Y& res2 = res;
            return res2;
        }
};

J'obtiens le message d'erreur suivant :

Dans la fonction membre "Y& Y: : ne peut pas déclarer que la variable 'res' est de type abstrait 'Y' car les fonctions virtuelles suivantes sont pures dans 'Y' : X& X::doStuff(X&) [avec T = int]

Si je change le type de l'argument en doStuff dans Y, tout se passe bien :

class Y : public X<int>
 {
    public:
        Y();
        virtual ~Y();
        Y& doStuff(X<int>& x) {
            Y res;
            Y& res2 = res;
            return res2;
        }
};

Pourquoi le paramètre ne peut-il pas être une référence à un objet Y lorsque Y implémente X ?

La valeur de retour de Y& ne génère pas de message d'erreur similaire.

Peut-être que je n'utilise pas la bonne approche pour atteindre ce que je veux - n'hésitez pas à me le faire savoir.

3voto

Max Raskin Points 479

En fixant Y& en tant que paramètre, vous modifiez la signature de doStuff et donc res est abstraite.

X<int>& n'est pas Y& même si Y hérite X .

2voto

πάντα ῥεῖ Points 15683

Pourquoi le paramètre ne peut-il pas être une référence à un objet Y lorsque Y implémente X ?

En effet, vous devez donner la signature exacte telle qu'elle a été déclarée dans la fonction virtuelle pure de la base.

C'est pourquoi

class Y : public X<int> {
    // ...
    X<int>& doStuff(X<int>& x) override;
};

œuvre.

Voir le fonctionnement Démonstration en direct .


Sans oublier que renvoyer une référence à une variable locale est un comportement indéfini.

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