关于C++:如何在派生类中重写模板类的静态方法

How to override static method of template class in derived class

我对重写基本类的静态方法有点问题,但整个问题非常复杂且太长(游戏引擎中的资源管理泛化),因此这里有一个简化的版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class T>
class base
{
    static void bar()
    { printf("bar"); }
public:
    static void foo()
    { bar(); }
};

class derived : public base<int>
{
    static void bar()
    { printf("baz"); }
};

int main() { derived::foo(); }

上面的代码输出"bar",在我的例子中,我希望它输出"baz"。我该怎么办?似乎不管我尝试什么,base::foo()总是调用base::bar()。我可能对设计有意见。我从来没有遇到过这个问题-我如何解决它?


您要做的是不能用简单的类继承实现;方法不能同时是staticvirtual

你需要一个static方法来调用一个没有对象(实例)的函数;你需要barvirtual以便bar::foo()在从derived实例调用时调用derived::bar()

这两个特点是相互排斥的。但奇怪的递归模板模式(crtp)可能是这里的解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>

template<class T>
struct base
{
    static void foo()
    {
        T::bar();
    }
};

struct derived : public base<derived>
{
    static void bar()
    {
        std::cout <<"derived" << std::endl;
    }
};

int main()
{
    derived::foo();
}

活生生的例子