2012-03-18 17 views

risposta

65

C++ non ha concetti integrati di interfacce. Puoi implementarlo utilizzando abstract classes che contiene solo pure virtual functions. Dal momento che consente l'ereditarietà multipla, puoi ereditare questa classe per creare un'altra classe che conterrà quindi questa interfaccia (intendo l'interfaccia dell'oggetto :-)).

Un esempio campione non sia qualcosa di simile -

class Interface 
{ 
public: 
    Interface(){} 
    virtual ~Interface(){} 
    virtual void method1()=0; // "=0" part makes this method pure virtual, and 
           // also makes this class abstract. 
    virtual void method2()=0; 
}; 

class Concrete : public Interface 
{ 
private: 
    int myMember; 

public: 
    Concrete(){} 
    ~Concrete(){} 
    void method1(); 
    void method2(); 
}; 

// Provide implementation for the first method 
void Concrete::method1() 
{ 
    // Your implementation 
} 

// Provide implementation for the second method 
void Concrete::method2() 
{ 
    // Your implementation 
} 

int main(void) 
{ 
    Interface *f = new Concrete(); 

    f->method1(); 
    f->method2(); 

    delete f; 

    return 0; 
} 
+6

L'esempio ha un comportamento _undefined_ perché l'interfaccia non ha un distruttore virtuale. –

+0

@CharlesBailey: Mi dispiace, ho dimenticato di dirlo. Grazie per averlo capito! Va bene adesso? –

+2

... sebbene anche l'esempio non debba essere compilato perché definite Concrete :: method1 e Concrete :: method2 ma questi non sono membri validi di Concrete e you.Instantiate Concrete sebbene sia ancora astratto. –

12

Non v'è alcun concetto di interfaccia in C++,
è possibile simulare il comportamento utilizzando un Abstract class.
La classe astratta è una classe che ha almeno una pura funzione virtuale, Non è possibile creare alcuna istanza di una classe astratta ma è possibile creare puntatori e riferimenti ad essa. Inoltre, ogni classe che eredita dalla classe astratta deve implementare le pure funzioni virtuali in modo che le istanze possano essere create.

7

L'interfaccia non è altro che una classe astratta pura in in C++. Idealmente questa interfaccia class deve contenere solo puri virtual metodi pubblici e dati static const. per esempio.

class interfaceA 
{ 
public: 
    static const int X = 10; 
    virtual void foo() = 0 
    virtual int get() const = 0; 
    virtual inline ~interfaceA() = 0; 
}; 
interfaceA::~interfaceA() {} 
+1

Che dire di un distruttore virtuale? –

+0

Aggiungerei un agente virtuale per evitare possibili perdite di memoria in futuro. – barankin

+0

@CharlesBailey, lo mancava. Modificato il post. Aggiunto come 'virtuale' puro solo per mantenere il puro' abstract'ness della classe e 'inline' in modo che possa risiedere nel file di intestazione senza errori di linker. – iammilind

Problemi correlati