How to override static method of template class in derived class

22,812

What you're trying to do is not achievable with simple class inheritance; a method cannot be both static and virtual.

You need a static method to be able to call a function without an object (an instance); and you need bar to be virtual so that bar<int>::foo() calls derived::bar() when called from a derived instance.

Those two traits are mutually exclusive. But the Curiously Recursive Template Pattern (CRTP) may be a solution here:

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

Live example

Share:
22,812
Biser Krustev
Author by

Biser Krustev

Updated on November 15, 2020

Comments

  • Biser Krustev
    Biser Krustev over 3 years

    I'm having a little issue with overriding static methods of base clases, but the whole question is very complicated and too long (generalization of resource management in game engine), so here's a simplified version:

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

    The code above outputs "bar" in my case, insted I want it to output "baz". How can I go about that? It seems that no matter what I attempt, base::foo() always calls base::bar(). I might have an issue with the design. I've never came across this problem - how can I resolve it?