2012-08-14 28 views
13

Duplicar posibles:
How do you declare an interface in C++?
Interface as in java in c++?¿Equivalente a las interfaces Java en C++?

Soy un aprendizaje de C++ programador de Java, y me preguntaba si hay algo así como interfaces de Java en C++, es decir, clases que otra clase puede implementar/extender más de uno de. Gracias. p.s. Nuevo aquí, así que dime si hice algo mal.

+8

C++ admite plena [herencia múltiple] (http://en.wikipedia.org/wiki/Multiple_inheritance), por lo que no hay distinción entre clases e interfaces como en Java. Si haces una clase con todos los métodos virtuales puros, entonces es el equivalente de una interfaz Java. – DaoWen

+0

Una clase abstracta con solo funciones de miembros virtuales puros. – oldrinb

+0

Considere también la palabra clave '__interface' de VC++. revisa MSDN. – MasterMastic

Respuesta

20

En C++ una clase que contiene solo métodos virtuales puros denota una interfaz.

Ejemplo:

// Define the Serializable interface. 
class Serializable { 
    // virtual destructor is required if the object may 
    // be deleted through a pointer to Serializable 
    virtual ~Serializable() {} 

    virtual std::string serialize() const = 0; 
}; 

// Implements the Serializable interface 
class MyClass : public MyBaseClass, public virtual Serializable { 
    virtual std::string serialize() const { 
     // Implementation goes here. 
    } 
}; 
+2

Necesita ** herencia virtual ** para emular la implementación de la interfaz Java. FTFY. –

+0

@ Cheersandhth.-Alf Eso es correcto. Gracias por la corrección. – StackedCrooked

+1

-1, es * clase abstracta *, no * interfaz *. No puede poseer objetos a través de su * interfaz *, es decir, * interfaz * no puede tener destructor público. (a menos que sea la interfaz 'IDestructible' *). – Abyx

-6

emular Java interface, se puede utilizar una base común con funciones virtuales puras única.

Necesita usar la herencia virtual, de lo contrario podría obtener herencia repetida: la misma clase puede ser una clase base más de una vez en C++. Esto significa que el acceso de esta clase base sería ambiguo en este caso.

C++ hace no proporcionar el equivalente exacto de Java interface: en C++, anulando una función virtual sólo puede ser hecho en una clase derivada de la clase con la declaración de función virtual, mientras que en Java, la overrider para un método en un interface se puede declarar en una clase base.

[Ejemplo:

struct B1 { 
    void foo(); 
}; 

struct B2 { 
    virtual void foo() = 0; 
}; 

struct D : B1, B2 { 
    // no declaration of foo() here 
}; 

D hereda también declaraciones de función: B1::foo() y B2::foo().

B2::foo() es puramente virtual, entonces D::B2::foo() es también; B1::foo() no reemplaza B2::foo() porque B2 no es una clase derivada de B1.

Por lo tanto, D es una clase abstracta.

--end ejemplo]

De todos modos, ¿por qué te emular los límites arbitrarios de Java en C++?

EDITAR: ejemplo añadido para la aclaración.

+0

Normalmente trato de evitar la herencia múltiple en C++, por lo que nunca he encontrado una herencia virtual. ¡Gracias por la aclaración! – DaoWen

+1

@DaoWen: tenga en cuenta que esta respuesta es técnicamente ** INCORRECTA **, y el cartel se ha negado a corregirla. –

+1

@Cheers y hth. - Alf: ¿podrías explicar por qué es incorrecto? – DaoWen