web-dev-qa-db-de.com

Können wir eine statische virtuelle Funktionen haben? Wenn nicht, warum?

Mögliches Duplikat:
C++ statische virtuelle Mitglieder?

Können wir eine statische virtuelle Funktionen haben? Wenn nicht, warum?

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

Nein, weil es in C++ keinen Sinn ergibt.

Virtuelle Funktionen aufgerufen werden, wenn Sie einen Zeiger/Verweis haben auf eine Instanz einer Klasse. Statische Funktionen sind nicht an eine bestimmte Instanz gebunden, sondern an eine Klasse. C++ hat keine Zeiger-to-Klasse, so gibt es kein Szenario, in dem Sie praktisch eine statische Funktion aufrufen könnte.

71

Das würde keinen Sinn ergeben. Der Punkt von virtuell Elementfunktionen ist, dass sie basierend auf dem dynamischen Typ von Objektinstanz, auf dem sie aufgerufen werden, ausgelöst werden. Andererseits sind statische Funktionen nicht an Instanzen gebunden und vielmehr eine Eigenschaft der Klasse. Daher macht es keinen Sinn, dass sie virtuell sind. Wenn Sie müssen, können Sie einen nicht statischen Dispatcher verwenden:

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

Verwendung:

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

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