2010-02-23 11 views
13

Además de los ejemplos de libros de texto, en el mundo real, ¿tiene sentido alguna vez usar la herencia múltiple (donde más de una de las clases base no son interfaces puras) en C++?¿Cuáles son los ejemplos del mundo real de la herencia múltiple de C++?

+0

+1 en casi 20 años de programación en C++ He * never * estado en el que * he necesitado * para usar herencias múltiples. – Raedwald

+0

@ Raedwald eso no significa que alguien no deba saber cómo funciona la Herencia Múltiple en C++. – anonymous

Respuesta

4

Lo más fácil es apuntar a iostream, que hereda de istream y ostream. cin y cout son istream y ostream respectivamente, pero fstream deriva de iostream.

0

He usado la herencia múltiple en el "mundo real", en un trabajo en el que participé en la codificación de una aplicación de mapeo.

Desafortunadamente, no puedo recordar el ejemplo exacto que encuentro increíblemente frustrante.

Sin embargo, aquí es un interesante artículo sobre los puntos a tener en cuenta y patrones alternativos o soluciones a considerar el uso de:

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.2

me gusta el uso de vehículos para los ejemplos - sobre todo la adición en el vehículo anfibio.

0

Herencia múltiple definitivamente tiene su lugar y puede ser muy útil. Como regla general, una clase base debe ser abstracta siempre que sea posible, lo que significa que no deberías poder crear un objeto a partir de ella, pero nada te impide heredar de una clase concreta. Definitivamente es un mérito también que pueda aprovechar la implementación heredada de la clase base. El ejemplo de una de las respuestas en iostream es bueno. Otro ejemplo es quizás decir que modela un empleado que es también un propietario/director de un negocio y modelará como

public class Director 
{ 
    ................ 
    double CalculateDividend(); 
    bool ApproveBudget(); 
}; 

public class Employee 
{ 
    ................ 
    double CalculateSalary(); 
}; 


public class WorkingDirector: Employee, Director 
{ 
    .............. 
}; 

Ahora un objeto WorkingDirector puede hacer lo que un empleado y un director puede hacer, que es una perfecto en el mundo real. Ni siquiera necesitaríamos sobrescribir ninguna implementación de método.

En muchos casos, la implementación de patrones de diseño también se simplifica con el soporte de herencia múltiple.

+0

Este no es un ejemplo de palabra real. – Petter

2

IMO, está abierto a discusión. Antes de las plantillas, había un buen número de casos que lo justificaban. Básicamente, podrías usar clases base como si pudieras usar clases de política con plantillas. Por ejemplo, considere una plantilla como:

template <typename policy1, typename policy2> 
class whatever { 
    policy1 p1; 
    policy2 p2; 
public: 
    void dosomething() { if (p1.enquire()) p2.dosomething(); } 
}; 

Si prefiere no utilizar las plantillas, por alguna razón, se puede obtener (a) las capacidades bastante similares con la herencia múltiple:

class whatever : policy1, policy2 { 
    void dosomething() { if (enquire()) dosomething(); } 

};

En ambos casos, básicamente está incorporando una instancia de la "política" en su nuevo objeto.Dado que estamos usando herencia privada, no hay ninguna preocupación con el LSP, al igual que con las plantillas basadas en políticas, la intención no es crear una gran jerarquía que afirme nada sobre las relaciones entre los miembros de la jerarquía, sino que es simplemente crear la capacidad de crear una gran variedad de clases no relacionadas bajo demanda.

Cuestiones relacionadas