2012-03-25 3 views
40

Eventuali duplicati:
C++ static virtual members?Possiamo avere una funzione virtuale statica? Se no, allora PERCHÉ?

possiamo avere un funzioni virtuali statiche? Se no, allora PERCHÉ?

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

Una possibile soluzione è quella di rendere un metodo statico (ma non virtuale) in classe di base e renderlo chiamare equivalente metodo statico nella classe derivata. In questo modo continui a mantenere l'incapsulamento e il polimorfismo. – anni

risposta

53

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

Le funzioni virtuali vengono richiamate quando si dispone di un puntatore/riferimento in 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.

+4

"Non ha senso"? Che dire dei metodi di classe in Python? – Mehrdad

+0

@ Mehrdad: non conosco Python. Potresti elaborare? –

+0

http://stackoverflow.com/a/38276/541686 – Mehrdad

14

Questo non avrebbe senso. Il punto delle funzioni membro virtuali è che vengono inviate in base al tipo dinamico dell'istanza dell'oggetto in 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); } 
}; 

Usage:

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

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

Continui a dire che "non ha senso" ma l'esempio che hai fornito mostra che potrebbe essere una cosa ragionevole per un linguaggio decidere di supportare, chiamando una funzione statica in una classe derivata. – Inverse

+2

@Inverse cos'altro potrebbe 'Base' essere in fase di runtime eccetto' Base'? –

+2

Può avere un senso se la funzione è pura virtuale CON un corpo. Quindi il compilatore commetterebbe degli errori se non lo si sovraccarica nella classe derivata. Pensa ad una funzione getInstance() ad esempio per creare singleton. Potresti voler avere un contratto che dice che ogni classe che deriva da questa Base deve avere un getInstance(). Vuoi che il compilatore lo controlli per te. – xryl669