c++ ereditarietà - Possiamo avere una funzione virtuale statica? Se no, allora PERCHÉ?



costruttori overriding (3)

Non avrebbe senso. Il punto delle funzioni dei membri virtuali è che vengono inviate in base al tipo dinamico dell'istanza dell'oggetto su cui vengono chiamate. D'altra parte, le funzioni statiche non sono correlate a nessuna istanza e sono piuttosto una proprietà della classe . Quindi non ha senso che siano virtuali. Se è necessario, è possibile utilizzare un dispatcher non statico:

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

Uso:

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

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

Possibile duplicato:
Membri virtuali statici C ++?

Possiamo avere una funzione virtuale statica? Se no, allora PERCHÉ?

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

No, perché non ha alcun senso in C ++.

Le funzioni virtuali vengono invocate quando si ha un puntatore / riferimento a un'istanza di una classe. Le funzioni statiche non sono legate a una particolare istanza, sono legate a una classe. Il C ++ non ha puntatori per classe, quindi non esiste uno scenario in cui si possa virtualmente invocare una funzione statica.


Un modo leggermente diverso di pensarci che potrebbe essere utile a qualcuno ... Un metodo di classe è usato in una superclasse per definire come dovrebbe comportarsi quel metodo quando viene chiamato da diverse classi figlie. Un metodo statico viene utilizzato quando vogliamo restituire la stessa cosa indipendentemente dalla classe figlio che stiamo chiamando.





c++ static-methods virtual-functions