How to override static method of template class in derived class
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();
}
Biser Krustev
Updated on November 15, 2020Comments
-
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?