Max, Me alegro que te haya sido de utilidad. =)
Es mas, gracias a vos por preguntar, habia tenido una noche muy mala (despues de una semana tambien bastante mala) y tu pregunta me ayudo a poner la cabeza en otra cosa. Pablo, Yo tampoco soy ningun especialista en C++, y por lo que vi es tal cual vos decis, la herencia privada no es del todo buena, pero dada la naturaleza de la programacion, como dice Bruce Eckel, esta para "completar" el lenguaje, para llenar un pequeno vacio y en algun caso, por mas extrano que sea, debe servir. Hay casos en los que hasta el infame Goto es necesario. =P Un abrazo para los dos! Juan 2009/2/14 Pablo Martín Viva <[email protected]>: > A ver hay algunas cosas que quiero decir, no soy experto en C++ ni mucho > menos, pero me parece que hasta el momento no vi un unico caso en el cual me > he topado con tener que realizar una herencia privada, generalmente uno > hereda para tener en la clase derivada la misma interfaz e implementacion > que en la clase base, para luego agregar nueva funcionalidad a esta... Pero > con la herencia privada estamos privandonos de ese hecho, es decir heredamos > la implementacion pero no la interfaz, y creo que todo eso se puede lograr > con composicion... > > Por ejemplo si componemos un objeto A con otro objeto B, desde A podemos > acceder igualmente a los atributo so miembros privados y / o protegidos > haciendo uso de clases friend, y con eso nos evitamos tener que hacer > herencia privada y todo el lio que eso incluye, te evita llevar tu codigo a > herencia multiple y cosas mas complicadas... > > Si queremos que la clase base anule un metodo virtual de la clase heredada > es mucho mas facil declarar al metodo como no virtual y listo... > > En mi opinion todo lo que te permite hacer la herencia privada se puede > lograr por otros medios mas simples... > > Por otro lado yo creo que estar heredando todo el tiempo es malo, hay un mal > diseño desde el comienzo.... > Saludos > Pablo > > El 14 de febrero de 2009 4:49, Maximiliano Milicich > <[email protected]> escribió: >> >> Juan genio !!! >> >> Muchas gracias x los links, habia googleado pero no habia llegado a esas >> paginas... >> >> Esta muy clara la explicacion de B. Eckel en "Thinking in C++"...para >> tener en cuenta: SIEMPRE ante la duda buscar en Eckel ! =) >> >> Tengo el Stroustrup, pero lo di vuelta de arriba abajo y no encontraba una >> explicacion clara... >> >> Ante todo, fe de erratas. >> donde dije: >> "Es decir, la herencia privada permite aprovechar la implementacion de la >> clase base, pero sin presentar su implementacion." >> quise decir: >> "Es decir, la herencia privada permite aprovechar la implementacion de la >> clase base, pero sin presentar su INTERFAZ." >> >> Luego, lo q saco en limpio en base a lo q contaste y a lo q lei, es: >> >> - La diferencia entre "herencia privada" y composicion es muy sutil. En >> general se puede pensar en ambos patrones ante un problema de este tipo. >> >> - "You may wonder what the purpose of private inheritance is, because the >> alternative of creating a private object in the new class seems more >> appropriate. private inheritance is included in the language for >> completeness, but if for no other reason than to reduce confusion, you'll >> usually want to use a private member rather than private inheritance" (Bruce >> Eckel) >> O sea, ante la duda, elegir composicion. Es menos "peligroso". >> >> - La herencia privada permite exponer "parcialmente" la interfaz de la >> clase base. Esto es una ventaja sobre la composicion. >> >> - Al heredar en forma privada, se puede acceder a miembros protegidos de >> la clase base. Esto es una ventaja sobre la composicion >> >> - Al heredar en forma privada en vez de elegir composicion, se puede caer >> en la herencia multiple (a veces fuente de problemas). Punto para la >> composicion. >> >> - La herencia privada permite que miembros de la clase derivada puedan >> "castear" a la clase base. Esto la verdad no se me ocurre en que casos >> podria servir... =S >> >> - "Use composition when you can, private inheritance when you have to." >> (de http://www.parashift.com/c++-faq-lite/private-inheritance.html) >> >> - Un caso en donde la herencia privada tiene mucha ventaja sobre la >> composicion es cuando en la clase base hay una funcion que llama a una >> funcion miembro virtual pura, esperando que una clase derivada la >> implemente. Y justamente nosotros queremos brindar la implementacion. (no se >> entendio nada, no ? jaja). >> Ver: >> http://www.parashift.com/c++-faq-lite/private-inheritance.html#faq-24.3 >> >> Tambien, agrego algunas consideraciones mas q estuve pensando: >> >> - Esta el tema de respetar la semantica. En gral se usaria herencia para >> decir "es-un", y composicion para decir "tiene-un". >> >> - Podria tambien ser necesario usar herencia privada cuando tratamos con >> clases que no son instanciables. En este caso no podria usarse la >> composicion. Ojo, esto no lo pense mucho, no se me ocurre ningun >> ejemplo...pero me suena a q por aca puede venir la cosa tambien... =/ >> >> En fin...si alguien quiere colaborar con algun comentario al respecto, >> bienvenido !! ja >> >> Muchas gracias, Juan ! >> Saludos >> MA_Xx >> >> >> >> >> 2009/2/14 Juan De Vincenzo <[email protected]> >>> >>> Hola Max, >>> >>> Mira te cuento, yo estoy estudiando C++ por mi cuenta y tu preg se me >>> hizo interesante asi que me puse a investigar y encontre bastante. Te >>> resumo las conclusiones: >>> >>> En contra de la herencia privada: >>> - La herencia privada te puede llevar innecesariamente a herencia >>> multiple. >>> >>> A favor: >>> - La herencia privada te permite que miembros de la clase base sean >>> convertidos de la clase base a la clase que hereda. (suena confuso ya >>> se, pero lo estoy traduciendo de una explicacion en ingles que incluye >>> codigo de ejemplo y tuve que resumir) >>> >>> - La herencia privada te da acceso a los miembros protegidos de la clase >>> base >>> >>> - La herencia privada te permite que la clase base anule funciones >>> virtuales del objeto que hereda de ella. >>> >>> No se como andas con el ingles, pero de todos modos te paso links en >>> donde encontre bastante info con ejemplos: >>> >>> >>> http://www.eng.cam.ac.uk/help/tpl/languages/C++/Thinking_in_C++/tic0145.html >>> >>> http://en.wikipedia.org/wiki/Inheritance_(computer_science) >>> >>> http://www.parashift.com/c++-faq-lite/private-inheritance.html >>> >>> http://www.cprogramming.com/tutorial/private.html >>> >>> http://www.parashift.com/c++-faq-lite/private-inheritance.html#faq-24.3 >>> >>> Espero que te sirva. De todos modos seguro alguien mas te puede dar >>> una explicacion mas clara ;). >>> >>> Saludos, >>> Juan >>> >>> 2009/2/14 Maximiliano Milicich <[email protected]>: >>> > Hola gente: >>> > Estoy estudiando para dar el final de Taller prog 1 (Veiga). >>> > Haciendo finales tomados, me encuentro con una pregunta q dice "para >>> > que >>> > sirve la herencia privada ? Ejemplificar" (C++) >>> > >>> > Tratando de responder esta pregunta me surge una duda: >>> > Que diferencia habria entre usar herencia privada vs usar composicion ? >>> > >>> > Es decir, la herencia privada permite aprovechar la implementacion de >>> > la >>> > clase base, pero sin presentar su implementacion. >>> > Asimismo, siendo herencia privada, el usuario de la clase derivada no >>> > puede >>> > realizar el "upcast" a la clase base. >>> > >>> > Entonces, no es esto similar a usar la clase base como composicion ? >>> > No se me ocurre algun ejemplo en donde la herencia privada sea mas >>> > conveniente que componer... =/ >>> > >>> > Muchas gracias a quien me quiera ayudar a despejar mi dilema. >>> > Saludos ! >>> > MA_Xx >>> > >>> > >>> > _______________________________________________ >>> > Lista de correo Programacion. >>> > [email protected] >>> > http://listas.fi.uba.ar/mailman/listinfo/programacion >>> > >>> > >>> _______________________________________________ >>> Lista de correo Programacion. >>> [email protected] >>> http://listas.fi.uba.ar/mailman/listinfo/programacion >> >> >> _______________________________________________ >> Lista de correo Programacion. >> [email protected] >> http://listas.fi.uba.ar/mailman/listinfo/programacion >> > > > > -- > Si yo tengo una manzana y tú tienes una manzana, luego de intercambiarlas > ambos tenemos una manzana. Si yo tengo una idea y tú tienes una idea, luego > de intercambiarlas ambos tenemos dos ideas. > > Apoyando a la comunidad Open Source. > > Facebook prifile: > http://www.facebook.com/profile.php?id=1244601012 > Orkut prifile: > http://www.orkut.com/Profile.aspx?uid=12594853021246287134 > > _______________________________________________ > Lista de correo Programacion. > [email protected] > http://listas.fi.uba.ar/mailman/listinfo/programacion > > _______________________________________________ Lista de correo Programacion. [email protected] http://listas.fi.uba.ar/mailman/listinfo/programacion
