在c ++中是否有一种方法可以让派生类覆盖基类静态方法?

时间:2017-05-14 10:43:38

标签: c++ class inheritance

我有一个多次派生的基类B:D1,D2等

在类B中,我希望有一个静态方法getInfo(),它返回一个BaseInfo类(基本上是一个包含类B的默认成员值的类),因此将它设置为静态是有意义的,因为不需要具体实例。

现在,有没有办法强制派生类来实现这个方法? 显然,每个派生类都有类成员自己的默认值。

理想情况下,如果在基类中我可以将getInfo()声明为虚拟静态,但由于在C ++中没有这样的东西,我想知道是否有一种很好的方法来实现这种行为。

我在考虑CRTP,但没有提出解决方案。

2 个答案:

答案 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)

  

将它设置为静态是有意义的,因为不需要特定的实例。

事实上在特定情况下需要。具体地,需要存储在实例中的运行时类型信息。唯一可能的选择是使函数成为虚拟,并在派生类中重写它。