La herencia múltiple en c ++

Si una clase de C ++ puede heredar de otra, entonces la pregunta surge inmediatamente: “¿Puede una clase hereda de dos (o más) clases?” La respuesta es un rotundo en “Sí”.

Puede ser valiosa para ver un ejemplo del mundo real de la herencia múltiple para entender por qué esto es una capacidad vale la pena tener. La mayoría de las universidades ofrecen puestos de trabajo a los estudiantes graduados como profesores ayudantes. Estos individuos son todavía estudiantes y tienen todas las propiedades de un estudiante - sino que, además, también se ofrezcan todas las características de un instructor. Por lo tanto, lógicamente, su árbol de herencia es el siguiente:

A & lt; span class =TeachingAssistant hereda de ambos Estudiante “/>

UN Asistente de enseñanza hereda de ambos Estudiante y Instructor.

Expresado en C ++, esto aparecerá como sigue:

Estudiante clase {public: doble GPA () - bool inscribirse (Curso) -bool pago (dólares dobles) -} - instructor de la clase {public: doble grado (artefacto) -bool enseñar (Curso) -bool GetPaid dólares (dobles) -} TeachingAssistant -class: Estudiante pública, instructor pública {public: asesor instructor (instructor) -Instructor asesor () -} -

La única diferencia entre este ejemplo y los ejemplos de la herencia simple es la aparición de dos nombres de clase después de la declaración de Asistente de enseñanza.

Dadas las definiciones de clase justo mostrado, todos los siguientes se pueden dijo:

TeachingAssistant ta - // obtener una calificación como un studentdouble d = ta.gpa () - // grado de un documento como un instructorta.grade (documento) - // me puede pasar una ta a una función que espera un partido Studentvoid (Estudiante ) -party (ta) - // o una función que espera una velada Instructorvoid (instructor) -soiree (ta) -

Hasta aquí todo bien. Lo que no me gusta de la herencia múltiple?

Video: 132. Programación en C++ || POO || Polimorfismo en C++

múltiples ambigüedades

revisando Estudiante y Instructor clases, tanto de estas clases comparten una característica: un número de identificación asignado por la universidad. Pero si intenta agregar esta propiedad de la siguiente manera, se obtiene nada más que quejas de C ++:

Estudiante clase {public: IntID () - doble GPA () - bool inscribirse (Curso) -bool pago (dólares dobles) -} - instructor de la clase {public: int id () - doble grado (artefacto) -bool enseñar (Curso) -bool GetPaid (dólares dobles) -} - TeachingAssistant clase: Estudiante pública, instructor pública {public: asesor instructor (instructor) -Instructor asesor () -

};

Video: Herencia múltiple en C++

Este problema se muestra gráficamente, aquí:

Adición de la <span class =Identificación del (a) Propiedad de ambos Estudiante y

id () propiedad se hereda de una clase base común a ambos
los
carné de identidad() propiedad se hereda de una clase base común a ambos Estudiante y Instructor.

Para tratar de expresar este estado de cosas en C ++, supongamos lo siguiente se escribe:

clase académica {public: int id () -} - Estudiante clase: Académico pública {public: doble GPA () - bool inscribirse (Curso) -bool pago (dólares dobles) -} - instructor de la clase: Académico pública {public: doble grado (artefacto) -bool enseñar (Curso) -bool GetPaid (dólares dobles) -} - TeachingAssistant clase: Estudiante pública, instructor pública {public: instructor asesor (instructor) -Instructor asesor () -} -

Por desgracia (y bastante sorprendente), este método no resuelve el problema en absoluto. Una referencia a ta.id () sigue siendo ambigua. Resulta que este código no crea la imagen- anterior en su lugar, se crea la situación que se muestra aquí:

Una clase de una sola base puede ser heredado en la subclase varias veces.

Una clase de una sola base puede ser heredado en la subclase varias veces.

Video: Herencia Múltiple C++

Parece que Asistente de enseñanza ahora hereda Académico dos veces - una vez a través de su Estudiante-Ness, y de nuevo a través de su Instructor-Ness. Ahora tiene una Estudiante Académico :: :: id () y un Instructor :: Académico :: id ().

La resolución de la ambigüedad

Con el fin de lograr lo que aparece en la tercera figura de este artículo en C ++, debe recurrir a las llamadas algo C ++ herencia virtual. Esta característica aparece en la acción de la siguiente manera:

clase TeachingAssistant: Estudiante pública virtual, instructor pública virtual {public: asesor instructor (instructor) -Instructor asesor () -} -

El uso de la virtual palabra clave indica a C ++ para combinar cualquier clases base comunes que Estudiante y Instructor podrían compartir. El siguiente ya no genera un error de compilación:

cout << "TA"s student id is " << ta.id()- // no error now

Con la herencia virtual, Asistente de enseñanza hereda una y sólo una copia de Académico y la referencia a ta.id () Ya no es ambiguo.

Video: Curso de C++ 80 Clases Herencia Múltiple

Artículos Relacionados