web-dev-qa-db-fra.com

Pouvons-nous avoir des fonctions virtuelles statiques? Sinon, POURQUOI?

Duplicata possible:
membres virtuels statiques C++?

Pouvons-nous avoir des fonctions virtuelles statiques? Sinon, POURQUOI?

class X
{
public:
       virtual static void fun(){} // Why we cant have static virtual function in C++?
};
53
Jatin

Non, car cela n'a aucun sens en C++.

Les fonctions virtuelles sont appelées lorsque vous avez un pointeur/référence vers une instance d'une classe. Les fonctions statiques ne sont pas liées à une instance particulière, elles sont liées à une classe. C++ n'a pas de pointeurs vers la classe, il n'y a donc aucun scénario dans lequel vous pourriez invoquer une fonction statique virtuellement.

71

Cela ne ferait aucun sens. Le point des fonctions membres virtuelles est qu'elles sont distribuées en fonction du type dynamique des instance d'objet sur lesquelles elles sont appelées. D'un autre côté, les fonctions statiques ne sont liées à aucune instance et sont plutôt une propriété de class. Cela n'a donc aucun sens pour eux d'être virtuels. Si vous le devez, vous pouvez utiliser un répartiteur non statique:

struct Base
{
    static void foo(Base & b) { /*...*/ }

    virtual ~Base() { }
    virtual void call_static() { foo(*this); /* or whatever */ }
};

struct Derived : Base
{
     static void bar(int a, bool b) { /* ... */ }

     virtual void call_static() { bar(12, false); }
};

Usage:

Base & b = get_instance();
b.call_static();   // dispatched dynamically

// Normal use of statics:
Base::foo(b);
Derived::bar(-8, true);
15
Kerrek SB