我有一个多次派生的基类B:D1,D2等
在类B中,我希望有一个静态方法getInfo(),它返回一个BaseInfo类(基本上是一个包含类B的默认成员值的类),因此将它设置为静态是有意义的,因为不需要具体实例。
现在,有没有办法强制派生类来实现这个方法? 显然,每个派生类都有类成员自己的默认值。
理想情况下,如果在基类中我可以将getInfo()声明为虚拟静态,但由于在C ++中没有这样的东西,我想知道是否有一种很好的方法来实现这种行为。
我在考虑CRTP,但没有提出解决方案。
答案 0 :(得分:3)
使用特征模式。
template<typename T> struct base_traits;
您期望getInfo
的每个班级都必须专门化这种类型。
template<>
struct base_traits<B>
{
static BaseInfo getInfo() { return b_info; }
};
template<>
struct base_traits<D1>
{
static BaseInfo getInfo() { return d1_info; }
};
template<>
struct base_traits<D2>
{
static BaseInfo getInfo() { return d2_info; }
};
要获得任何特定类的BaseInfo
,请编写
BaseInfo d1info = base_traits<D1>::getInfo();
如果某人忘记为其派生类型base_traits<T>
专门化T
,则会出现编译错误。
BaseInfo d3info = base_traits<D3>::getInfo();
error: incomplete type ‘base_traits<D3>’ used in nested name specifier
答案 1 :(得分:0)
将它设置为静态是有意义的,因为不需要特定的实例。
事实上在特定情况下需要。具体地,需要存储在实例中的运行时类型信息。唯一可能的选择是使函数成为虚拟,并在派生类中重写它。