2012-03-18 24 views

Respuesta

65

C++ no tiene conceptos integrados de interfaces. Puede implementarlo usando abstract classes que contiene solo pure virtual functions. Como permite la herencia múltiple, puede heredar esta clase para crear otra clase que contendrá esta interfaz (me refiero a la interfaz de objeto :-)) en ella.

Un ejemplo muestra sería algo como esto -

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

Su ejemplo tiene _un comportamiento definido_ porque la interfaz no tiene un destructor virtual. –

+0

@CharlesBailey: Lo siento, olvidé mencionar eso. Gracias por atrapar eso! ¿Está bien ahora? –

+2

... aunque su ejemplo tampoco debería compilarse porque define Concrete :: method1 y Concrete :: method2 pero estos no son miembros válidos de Concrete y usted. Instala Concrete aunque todavía es abstracto. –

12

No existe el concepto de interfaz en C++,
se puede simular el comportamiento utilizando un Abstract class.
La clase abstracta es una clase que tiene al menos una función virtual pura. No se pueden crear instancias de una clase abstracta pero se pueden crear punteros y referencias a ella. Además, cada clase que hereda de la clase abstracta debe implementar las funciones virtuales puras para que se puedan crear instancias.

7

La interfaz no es más que una clase abstracta pura en C++. Lo ideal es que esta interfaz class contenga solo puros virtual datos públicos y datos static const. p.ej.

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

¿Qué tal un destructor virtual? –

+0

Agregaría un controlador virtual para evitar posibles fugas de memoria en el futuro. – barankin

+0

@CharlesBailey, se perdió eso. Editado la publicación. Agregado como puro 'virtual' solo para mantener el' abstract'ness puro de la clase y 'inline' para que pueda residir en el archivo de cabecera sin errores del enlazador. – iammilind