2010-08-06 3 views
1

J'ai une classe C++ destinée à être héritée. Tous ses enfants hériteront d'une méthode:Classe enfant en tant que type de retour pour une méthode de classe

class Record { 
public: 
    RETTYPE* all(); 
}; 

class Child : public Record { 
    int age; 
    char *name; 
}; 

int main() { 
    Child boo; 
    Child boos* = boo->all(); // Pointer to array of Children 
    return 0; 
}; 

Comment puis-je faire retourner une méthode (un pointeur vers) elle-même? Je ne peux pas simplement dire Record all(); car Child n'est pas Record. La méthode ne sera jamais appelée Record. Toujours sur une classe héritée de Record.

+0

Il est vous qui doit nous dire pourquoi vous mettez la méthode tout() à la classe de base. Pourquoi? Si seulement pour la réutilisation de code, je pense que vous devriez repenser cela. Si pour un comportement polymorphique, faites-le virtuel. Child est un type d'enregistrement qui peut renvoyer un enregistrement * mais C++ prend en charge la covariance du type de retour –

Répondre

3

est ici une façon

class Record { 

}; 

template<class T> 
class RecordOf : public Record { 
public: 
    T* all(); 
}; 

class Child : public RecordOf<Child> { 
    int age; 
    char *name; 
}; 

Chaque sous-classe dispose désormais d'une toute méthode qui retourne le type exact. Vous pouvez mettre des méthodes qui sont virtuelles et qui ont la même signature dans les sous-classes Record et celles qui dépendent du type exact dans RecordOf.

Il est appelé Chose curieuse Récurrent modèle de modèle

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

Questions connexes