una resueltos que programacion poo polimorfismo orientada objetos interfaz herencia ejercicios ejemplos ejemplo codigo clases c++ interface header virtual-functions

resueltos - Interfaz y funciones virtuales en C++ en comparación con la interfaz de Java



programacion orientada a objetos ejemplos (5)

C ++ no tiene interfaces como Java. Lo más cerca que puede estar es cuando define una clase que solo tiene funciones virtuales puras, de modo que todos los que se derivan de esa clase se ven obligados a implementarlas todas.

Tengo una pregunta sobre las funciones virtuales de C ++. La palabra clave virtual se usa en la declaración de class C ++ en una función en una clase base para notificar que una implementación de subclase de esa función puede diferir de una subclase a una subclase. Diferentes subclases pueden tener diferentes implementaciones de la función.

No lo entiendo un poco Cuando defines la interfaz en C ++, no es como en Java hasta ahora.

De hecho, no entiendo qué significa la interfaz de palabras en C ++. Usted especifica una función como virtual en el archivo de encabezado. Entonces, las subclases o las clases derivadas de la clase base pueden anularlo de la manera que desee, siempre que se trate de una función virtual.

¿La interfaz en C ++ es un archivo de cabecera?

Aclamaciones


La interfaz de una clase c ++ se define en el archivo de encabezado. Las funciones virtuales solo se usan si desea crear una subclase y usar la herencia.

Lo más parecido a una interfaz java en c ++ es cuando utilizas una clase abstracta pura. Las clases de implementación que tienen esta interfaz tienen que subclasificar esta clase abstracta.

No olvides hacer que tu deconstructor sea virtual o no se invocará al deconstructor de las subclases al hacer referencia a la clase base.

ejemplo:

class PuppetInterface { public: virtual ~PuppetInterface() {}; virtual void walk() = 0; virtual void tellALie() = 0; }; class Pinocchio : public PuppetInterface { public: ~Pinocchio() { //lie down look dead. } void walk() { //try moving wooden legs. } void tellALie() { //let nose grow look serious. } }; int main(int argc, const char * argv[]) { PuppetInterface* pinocchio = new Pinocchio(); pinocchio->walk(); pinocchio->tellALie(); delete pinocchio; return 0; }

Editar : Dado que los punteros crudos son malos, no se guardan excepciones, es probable que se filtren, etc. El código anterior debe reescribirse como

//using c++ 11 int main(int argc, const char * argv[]) { auto pinocchio = std::unique_ptr<PuppetInterface>(new Pinocchio()); pinocchio->walk(); pinocchio->tellALie(); }


La principal diferencia entre Java y C ++ es el hecho de que en Java todas las funciones son virtual .

Históricamente, cuando se ha desarrollado C ++, el hecho de colocar una capa de abastramiento entre cada llamada de función (eso es lo que sucede usando una tabla de método virtual) no era algo que quisieras para cada llamada de método porque una invocación de método virtual es más lenta.

Entonces, lo que sucede es que debe especificar que un método debe invocarse a través de un enlace dinámico ; de lo contrario, el método se elige durante el tiempo de compilación de acuerdo con la declaración de la variable. Esto significa que si declara Base *b = new Derived() y llama a un método en b que no es virtual, entonces el método se elige en tiempo de compilación y será un Base::method .

El lema es que no pagas por lo que no usas y eso es todo.

Las interfaces en C ++ no existen, pero puede tener una clase con solo funciones virtuales puras que se comporten básicamente de la misma manera. En realidad, puedes tener dos tipos de métodos virtuales:

class Base { virtual void method() { //implementation } virtual void pureMethod() = 0; }

El primer method() es virtual y obedece al enlace dinámico, pero se implementa incluso en la clase base mientras que pureMethod() obedece al enlace dinámico pero se declara como puramente virtual, por lo que no tiene ninguna implementación, por lo que no se puede crear una instancia de base. es y necesita subclasificarlo y anular al menos el método virtual puro.


Un método virtual en C ++ es un método que puede anularse. Un método virtual puro (definido como virtual foo () = 0 ) es un método abstracto. Para crear una interfaz como las que usa en Java, simplemente especifique que todos los métodos son puros virtuales (abstractos).

Sin embargo, a veces la "interfaz" se refiere a los miembros públicos y a los tipos de una clase que generalmente está completamente dentro del encabezado.


La interfaz en Java es una construcción o palabra clave en particular. Java tiene una interface palabras clave que se utiliza para indicar que una clase de Java no proporciona la implementación real, sino que describe la interfaz que debe implementar una clase derivada. Esto es verificado por el compilador de Java para garantizar que una clase que dice implementar una interfaz proporcione todos los métodos necesarios para la interfaz.

En Java, la palabra clave de interface indica que una clase proporciona un conjunto de servicios descritos por la clase de interfaz especificada. Una clase Java puede implementar múltiples interfaces diferentes.

La forma en que se usa la interfaz de palabras en las discusiones con C ++ es un concepto algo similar ya que tiene que ver con los tipos de parámetros de una clase o función o método. Sin embargo, no hay palabra clave de interface en C ++. La interfaz de la palabra se usa de una manera más genérica y descriptiva con C ++ como en "La interfaz de función toma dos cortos y uno largo". que indica la función que llama a los argumentos y sus tipos, la interfaz entre el que llama de la función y el cuerpo de la función.

Por lo tanto, piense en la interfaz en C ++ como un tipo de contrato entre la clase que implementa la interfaz y cualquier objeto que esté utilizando objetos instanciados de la clase. Una clase también puede proporcionar varios servicios relacionados diferentes, cada uno de los cuales tiene una interfaz particular.

Uno puede hacer algo similar al concepto de interface Java en C ++ utilizando métodos virtuales puros en una descripción de clase para crear una clase abstracta. Esto crea una clase de C ++ sin implementación. Ver C ++: Crear clase abstracta con método abstracto y anular el método en una subclase .

Lo que hace un método virtual es proporcionar un mecanismo para que los objetos que usen clases derivadas de la clase puedan depender de una interfaz particular, dejando los detalles de la implementación en la clase derivada. Entonces esto es similar a la interfaz de Java. Los métodos virtuales de C ++ son una forma de proporcionar una forma de implementar una interfaz Java usando un enfoque compilado y estático comprobado en lugar de un enfoque de tiempo de ejecución.

Con un método virtual puede crear un tipo de superclase que se puede usar para crear variables de puntero a las que se pueden asignar variables de los tipos derivados y cuando usa el método virtual, se llamará al método correcto de la clase derivada. Averiguar qué método llamar se realiza en tiempo de compilación, no en tiempo de ejecución. La idea principal de C ++ es ser tan eficiente como C al tiempo que proporciona construcciones de lenguaje orientadas a objetos junto con la comprobación de tipos estáticos en tiempo de compilación para reducir la dependencia de la detección de errores en tiempo de ejecución con su sobrecarga adicional.

class Joe { public: virtual int thingOne() { return 1;} // standard, not pure virtual method .. }; class JoeTwo : public Joe { public: int thingOne() { return 2;} // derived class provides its own version of the method .. }; Joe *myJoe = new JoeTwo; int i = myJoe->thingOne(); // value of 2 put into i and not value of 1

Con C ++, necesita reconocer la diferencia entre un objeto y un puntero a un objeto debido a la división de objetos que puede ocurrir cuando una variable que contiene un objeto derivado se asigna a una variable que contiene la superclase del objeto derivado. Este " corte de objetos " ocurrirá porque el objeto derivado no cabe en la clase base o el objeto de la superclase de la que se deriva. El objeto derivado tiene elementos adicionales que el objeto de la superclase no tiene, por lo que con la asignación (la asignación predeterminada es copia de memoria recta), solo la parte de la superclase del objeto derivado se copia en el objeto de la superclase.

class Joe { public: virtual int thingOne() { return 1;} // standard, not pure virtual method .. }; class JoeTwo : public Joe { public: int thingOne() { return 2;} // derived class provides its own version of the method .. }; Joe *myJoe = new JoeTwo; // no object slicing since this is pointer JoeTwo myJoeTwo; Joe myJoeSliced = myJoeTwo; // JoeTwo object myJoeTwo sliced to fit into Joe object myJoeSliced