J'ai un ensemble de classes dérivées toutes d'une classe de base commune. Je veux utiliser ces classes de manière polymorphique. L'interface définit un ensemble de méthodes getter dont les valeurs de retour sont constantes dans une classe dérivée donnée, mais varient d'une classe dérivée à l'autre. .: par exemple Méthodes virtuelles C++ pour les attributs propres à la classe ou la structure externe
enum AVal
{
A_VAL_ONE,
A_VAL_TWO,
A_VAL_THREE
};
enum BVal
{
B_VAL_ONE,
B_VAL_TWO,
B_VAL_THREE
};
class Base
{
//...
virtual AVal getAVal() const = 0;
virtual BVal getBVal() const = 0;
//...
};
class One : public Base
{
//...
AVal getAVal() const { return A_VAL_ONE };
BVal getBVal() const { return B_VAL_ONE };
//...
};
class Two : public Base
{
//...
AVal getAVal() const { return A_VAL_TWO };
BVal getBVal() const { return B_VAL_TWO };
//...
};
etc.
Est-ce une façon courante de faire les choses? Si la performance est un facteur important, serais-je mieux tirer les attributs dehors dans une structure externe, par exemple .:
struct Vals
{
AVal a_val;
VBal b_val;
};
stocker une Vals*
dans chaque cas, et la réécriture Base
comme suit?
class Base
{
//...
public:
AVal getAVal() const { return _vals->a_val; };
BVal getBVal() const { return _vals->b_val; };
//...
private:
Vals* _vals;
};
La déréférence supplémentaire est-elle essentiellement la même que celle de vtable? Quel est l'idiome établi pour ce type de situation? Sont à la fois de ces solutions stupide? Tous les aperçus sont grandement appréciés
Conception pour la clarté et l'évolutivité facile. Aucune méthode n'apparaîtra sur le radar d'un profileur à moins que ce soit votre opération de programme la plus interne. –