【发布时间】:2010-06-08 17:37:36
【问题描述】:
我有一组类都派生自一个公共基类。我想多态地使用这些类。该接口定义了一组 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;
};
在每个实例中存储一个Vals*,并重写Base如下?
class Base
{
//...
public:
AVal getAVal() const { return _vals->a_val; };
BVal getBVal() const { return _vals->b_val; };
//...
private:
Vals* _vals;
};
额外的取消引用本质上与 vtable 查找相同吗?这种情况的成语是什么? 两个这些解决方案都愚蠢吗?非常感谢任何见解
【问题讨论】:
-
设计清晰且易于扩展。除非这是您最内部的程序操作,否则这两种方法都不会出现在分析器的雷达上。
标签: c++ attributes virtual getter