Classe abstraite et constructeur par copie

Fermé
walternative Messages postés 2 Date d'inscription dimanche 18 mars 2012 Statut Membre Dernière intervention 14 mai 2014 - 14 mai 2014 à 10:56
 Utilisateur anonyme - 14 mai 2014 à 11:45
Bonjour,

j'ai une lacune concernant les classes abstraites et leur constructeur par copie.

J'ai une classe mère abstraite, et des classes filles qui en hérite.

Je souhaite implémenter une méthode qui fonctionnerait exactement de la même facon dans toutes les classes filles, c'est pourquoi je voudrais mettre cette méthode dans la classe mère.
Ma méthode nécéssite d'appeller le constructeur par copie.
Or ma classe mère étant virtuelle, je ne peux pas appeller son constructeur par copie.

Comment puis-je déclarer dans la classe mère abstraite une méthode qui appellera le constructeur par copie de la fille ?
Ou plutôt comment gère t'on ce cas ? J'ai oublié.

J'espère avoir été clair et concis.
Merci d'avance.
A voir également:

3 réponses

salut,

je t'ai fais un exemple :


class Base {
public:
Base(int val){}
virtual int Get() = 0;
};

class Derived1 : Base
{
private:
int value;
public :
Derived1(int val) :Base(val)
{
value = val;
}
int Get() {
return value > 0;
}
};

le constructeur ne peut pas être surchargé, mais tu peux l'appeler en même temps que la classe dérivée.

naga
0
walternative Messages postés 2 Date d'inscription dimanche 18 mars 2012 Statut Membre Dernière intervention 14 mai 2014
14 mai 2014 à 11:30
wouahou Merci SO MUCH !!!

Je ne pensais pas avoir une réponse du tout ! Merci infiniement !

Cela dit, j'ai du mal m'expliquer.

Je veux avoir une méthode dans la classe mère qui ferait :

bool classeMere::canMove(SENS sens, chaineBrique* chaine)
{
classeMere copie = this; // <-- Impossible d'utiliser le constructeur par copie de la classe abstraite
copie.movePiece(SENS);
return !copie.detecterCollision(chaine);
}

Pour ne pas avoir dans chaque classe fille :

bool classeFille_1::canMove(SENS sens, chaineBrique* chaine)
{
classeFille_1 copie = this; // <-- Juste ca qui change
copie.movePiece(SENS);
return !copie.detecterCollision(chaine);
}

bool classeFille_2::canMove(SENS sens, chaineBrique* chaine)
{
classeFille_2 copie = this; // <-- Juste ca qui change
copie.movePiece(SENS);
return !copie.detecterCollision(chaine);
}

et ainsi de suite...
0
Utilisateur anonyme
14 mai 2014 à 11:45
dans ce cas tu n'as même pas besoin de faire quoi que ce soit : tu déclare la fonction "normalement" et les classes filles vont en hériter. par exemple tu peux faire :


class dep {
public:
dep(){}
dep(int val){}
virtual int Get() = 0;
int test() { return 0; }

};

class Derived1 : public dep
{
private:
int value;
public:
Derived1() :dep()
{
value = 0;
}
Derived1(int val) :dep(val)
{
value = val;
}
int Get() {
return value > 0;
}
int recup_test(){ return test(); }
};


ici, j'ai ma méthode test() qui est déclaré normalement dans ma classe mère. Je peux y accéder depuis le main de manière transparente :


int _tmain(int argc, _TCHAR* argv[])
{
Derived1 * d1 = new Derived1(1);

int i = d1->Get();
i = d1->test();
i = d1->recup_test();

return 0;
}

attention tout de même, j'ai du rajouter l'attribut public au niveau de la déclaration de ma seconde classe (class Derived1 : public dep).

si tu as des question, n'hésites pas.

naga
0