Dans la hiérarchie d'héritage par exemple trivial:Copier proprement une instance d'une baseclass ou d'une sous-classe en C++?
class Food
{
virtual ~Food();
};
class Fruit : public Food
{
virtual ~Fruit();
};
class Apple: public Fruit
{
virtual ~Apple();
}
class Vegetable: public Food
{
virtual ~Vegetable();
}
Je souhaite créer une méthode qui peut cloner un objet de sa sous-classe ou une instance baseclass:
Apple* apple1 = new Apple();
Apple* clone1 = apple1->clone();
Food* food1 = apple1;
Apple* clone2 = food1->clone();
Je vois quelques solutions possibles au problème :
Utilisez le polymorphisme pour créer une fonction virtuelle explicitement définie pour chaque sous-classe.
Utilisez une méthode de fabrique basée sur un modèle pour prendre une instance d'une classe et le type de la sous-classe pour créer la nouvelle instance.
Enregistrez un identifiant avec chaque classe et sous-classe stockée ailleurs pour rechercher la sous-classe à créer lors de l'appel d'une fonction de clonage baseclass.
Aucune de ces semble idéal, mais je me penche plus vers la troisième solution, car il simplifie d'appeler la fonction clone sans nécessiter une définition à écrire pour toutes les sous-classes (pour lesquelles il y aura beaucoup).
Cependant, je suis très ouvert à toutes les suggestions, y at-il de meilleures façons de le faire?
@DeadMG: votre solution ne semble pas fonctionner avec la hiérarchie des classes de l'OP. Pourriez-vous montrer comment vous abordez la question de cette hiérarchie, Food <- Fruit <- Apple, afin que toutes les classes soient clonables? –
@Alf: Vous avez raison en ce que j'ai raté la classe intermédiaire Fruit, donc je vais modifier. – Puppy
@DeadMG: dans l'exemple de l'OP, ce sont des classes (apparemment) concrètes. Maintenant, ils sont abstraits. Un exemple pratique plus concret d'une hiérarchie de classes concrètes où le clonage est nécessaire (en C++ 98) est une hiérarchie de classes d'exceptions. Alors, pourriez-vous peut-être aussi rendre les classes concrètes? Alors que toutes les classes sont clonables? Cheers, –