我有一组类都派生自一个公共基类。我想多态地使用这些类。该接口定义了一组 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 查找相同吗?这种情况的成语是什么?这两种解决方案都是愚蠢的吗?非常感谢任何见解