2013-05-15 22 views
7

Sono un neofita della programmazione in C++, ho un dubbio durante l'esecuzione di alcuni programmi C++, ovvero come ottenere il binding dinamico per la funzione membro statico. il binding dinamico delle normali funzioni membro può essere ottenuto dichiarando le funzioni membro come virtuali ma non possiamo dichiarare le funzioni membro statiche come virtuali, quindi per favore aiutatemi. e vedere l'esempio di seguito:ereditarietà delle funzioni membro statico

#include <iostream> 
#include <windows.h> 
using namespace std; 

class ClassA 
{ 
    protected : 
    int width, height; 
    public: 
    void set(int x, int y) 
    { 
     width = x, height = y; 
    } 
    static void print() 
    { 
     cout << "base class static function" << endl; 
    } 
    virtual int area() 
    { 
     return 0; 
     } 
}; 

class ClassB : public ClassA 
{ 
    public: 
    static void print() 
    { 
    cout << "derived class static function" << endl; 
    } 
    int area() 
    { 
    return (width * height); 
    } 
}; 

int main() 
{ 
    ClassA *ptr = NULL; 
    ClassB obj; 
    ptr = &obj ; 
    ptr->set(10, 20); 
    cout << ptr->area() << endl; 
    ptr->print(); 
    return 0; 
} 

Nel codice sopra ho assegnato oggetto di classe derivata a un puntatore e chiamando la funzione di stampa di membro static(), ma è il richiamo della funzione classe base in modo come posso raggiungere dinamica legare per la funzione membro statico.

risposta

7

Il collegamento dinamico desiderato è un comportamento non statico.

binding dinamico è vincolante basata sul puntatore this e static funzioni per definizione non è necessario o richiedere un puntatore this.

Supponendo che la funzione sia statica in altre situazioni (non è necessario che sia statica nell'esempio) è possibile avvolgere la funzione statica in una funzione non statica.

class ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassA::print(); 
    } 
}; 

class ClassB : public ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassB::print(); 
    } 
}; 
+0

bello! mi piace. –

1

Il collegamento dinamico non ha molto senso poiché non è nemmeno necessario un oggetto per chiamare la funzione statica.

1

Non è possibile rendere i metodi statici come virtuali. Basta rendere il metodo di stampa virtuale (proprio come il metodo area). Servirebbe il tuo scopo.

3

Pertanto, in questo caso sono presenti due problemi, il primo è che non è possibile utilizzare l'ereditarietà con funzioni statiche. Il secondo è che manca la parola chiave virtual per dire al compilatore che questa funzione può essere sovrascritta dalle classi figlie.

Quindi, supponendo di aver risolto il problema statico.

virtual void print(){...} 
Problemi correlati