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

标签 c++ class inheritance

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

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

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

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

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

最佳答案

使用特征模式。

template<typename T> struct base_traits;

您期望的每一个类 getInfo from 必须专门化这种类型。

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

关于c++ - C++中有没有办法让派生类重写基类静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43962948/

相关文章:

c++ - 允许使用右值捕获但不分配给的运算符重载

c++ - 通过 return const 而不是函数重载?

添加时克隆元素的Java列表

php - 实例化类方法而不实例化 PHP 中的类不再可能?

c++ - 从具有虚拟基类的非虚拟后代派生的规则

javascript - 在javascript中调用祖父函数

c++ - 需要改进我的代码的建议 : Search Algorithm

c++ - 如何像 Delphi 应用程序一样创建独立的(没有 DLL 文件依赖项)C++Builder 控制台应用程序?

C++ 将一个对象传递给另一个对象?

php - 为什么不能从一个尚未定义的类继承,而该类继承自一个尚未定义的类?