Static Virtual functions in c++
Asked Answered
E

7

12

I have a base class and a derived one and I want to change base functions while keeping them static as they should be passed to other functions as static.

How can I do that?

Etam answered 9/6, 2011 at 10:8 Comment(1)
Give a concrete, minimal and complete example of what you are trying to achieve (not what you think you want to implement), and we can think about how to do that.Cradling
I
26

The ATL framework gets around the limitation of no virtual statics by making the base class be a template, and then having derived classes pass their class type as a template parameter. The base class can then call derived class statics when needed, eg:

template< class DerivedType >
class Base
{
public:
  static void DoSomething() { DerivedType::DoSomethingElse(); }
};

class Derived1 : public Base<Derived1>
{
public:
  static void DoSomethingElse() { ... }
};

class Derived2 : public Base<Derived2>
{
public:
  static void DoSomethingElse() { ... }
};

This is known as Curiously recurring template pattern, which can be used to implement static polymorphism.

Inosculate answered 10/6, 2011 at 21:31 Comment(5)
This design is exactly what I need, but there's a problem. How can you use Base<Derived1> when you're declaring class Derived1 ? I mean, this cause me errors : error: expected a type, got ‘Derived1’ and error: type/value mismatch at argument....Whirligig
Try changing typename to class. And read this: Curiously recurring template pattern.Inosculate
Nice one ! I didn't know about that design. That's working now, thank you very much. I already +1 your answer.Whirligig
Great answer! However, with this approach it is not possible anymore to do something like: Base *b; if(cond) b = new Derived1(...); else b = new Derived2(...). Is there a workaround to still be able to use polymorphism in that way? Thank you!Chantellechanter
@Chantellechanter create a non-template base class for Base to derive fromInosculate
S
3

Do you mean you need a pointer to a static function (e.g. to pass as an argument to another function that requires a pointer to a static function), but you need to access that function pointer virtually? In that case, use a virtual function to get the function pointer:

typedef void (*function)();
void do_stuff_with_function(function);

struct Base {
    virtual ~Base() {}
    virtual function get_function() = 0;
};

struct Derived : Base {
    function get_function() {return my_function;}
    static void my_function();
};

Derived d;
do_stuff_with_function(d.get_function());
Semiconscious answered 9/6, 2011 at 10:27 Comment(0)
M
2

static function can not be virtual since they do not have an instance through which they are accessed. I do believe you can overwrite them though.

Mithraism answered 9/6, 2011 at 10:12 Comment(2)
i know that i can not use static and virtual at the same time but i have to do something like thatEtam
there is just no way to do it. either use the function pointer trick (which I would strongly discourage) or remove the static constraint. If the static method is used to create an instace, have alook at the factory pattern (programmerjoe.com/2007/03/18/the-abstract-factory-pattern-in-c)Mithraism
R
1

You can't have static virtual functions in C++.

Rilke answered 9/6, 2011 at 10:13 Comment(1)
Please elaborate on your response.Hawley
O
1

Virtual functions typically rely on this pointer to determine the type of function to be called at run time.

A static member function does not pass a this so static virtual functions are not allowed in C++.

Osculate answered 9/6, 2011 at 10:16 Comment(0)
S
0

If i am correct in understanding ur question, then u can follow the following approach otherwise ignore..

have static function pointer in the base class.

in base class have a static function ( in which u call the function by using that static function pointer)..

in derived classes set that static function poiter to the function defination u wish to execute.. ( in base class u can set the function pointer to some default function).

Shrove answered 9/6, 2011 at 10:16 Comment(2)
i did something like that i make a static function and a virtual one in the base class, and the static calls the virtual one after it changed in the derived class but now the problem is the virtual does not go to derived class so it does not changeEtam
@frank hi, i am not asking u to have a virtual function ... i want u to have a static function pointer, and a setter for that variable... which u call from ur subclasses.... and in ur main static function u just call the function using that function pointer.Shrove
S
-1

You cannot have static virtual functions, because it doesn't make sense to have them.

Sifuentes answered 9/6, 2011 at 10:16 Comment(1)
Actually, it can make sense: it's like any other virtual function where the implementation changes based on the derived type of the class. It's just that you don't have an instance. Delphi, for example, allows it and they can be rather useful.Epps

© 2022 - 2024 — McMap. All rights reserved.