C ++中有没有办法让派生类重写基类静态方法

is there a way in c++ to have derived classes override a base class static method?

本文关键字:派生 重写 基类 静态方法 有没有      更新时间:2023-10-16

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

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

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

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

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

使用特征模式。

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();

如果有人忘记为派生类型T专门化base_traits<T>,则会出现编译器错误。

BaseInfo d3info = base_traits<D3>::getInfo();
error: incomplete type ‘base_traits<D3>’ used in nested name specifier

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

事实上,在特定

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