すべて共通の基本クラスから派生した一連のクラスがあります。これらのクラスを多態的に使用したい。インターフェイスは、戻り値が特定の派生クラス全体で一定であるが、派生クラスごとに異なる getter メソッドのセットを定義します。例えば:
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;
};
各インスタンスにa を格納し、次のようVals*
に書き換えBase
ますか?
class Base
{
//...
public:
AVal getAVal() const { return _vals->a_val; };
BVal getBVal() const { return _vals->b_val; };
//...
private:
Vals* _vals;
};
追加の逆参照は、本質的に vtable ルックアップと同じですか? この種の状況の確立されたイディオムは何ですか? これらのソリューションは両方ともばかげていますか? どんな洞察も大歓迎です