У меня есть набор классов, которые являются производными от общего базового класса.Я хочу использовать эти классы полиморфно.Интерфейс определяет набор методов-получателей, чьи возвращаемые значения постоянны для данного производного класса, но варьируются от одного производного класса к другому.Например:
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 };
//...
};
и т. д.
Это обычный способ ведения дел?Если производительность является важным фактором, лучше ли мне извлекать атрибуты во внешнюю структуру, например:
struct Vals
{
AVal a_val;
VBal b_val;
};
, сохраняя Vals*
в каждом случае и переписывая Base
следующим образом?1011 *
class Base
{
//...
public:
AVal getAVal() const { return _vals->a_val; };
BVal getBVal() const { return _vals->b_val; };
//...
private:
Vals* _vals;
};
Является ли дополнительная разыменование по существу такой же, как поиск в vtable?Какова установленная идиома для этого типа ситуации? оба этих решений тупые? Любые идеи очень ценятся