gracias Gonzalo x el aporte !! Saludos MA_Xx
On Fri, Feb 20, 2009 at 8:22 AM, Gonzalo Merayo <[email protected]> wrote: > Les agrego un par de top-posts que no vi en el thread: > > Al heredar en forma privada no se puede usar el objeto > polimorficamente (ie: si heredo privado de list no puedo meter el > objeto en un list& o list*). El caso tipico es heredar de la stl que > no tiene destructor virtual, si no lo hago de este modo alguien podria > crear un list* con mi objeto y al ejecutar delete se llama el > destructor de la lista pero no el de mi objeto. > > Usar herencia privada en lugar de composicion garantiza que el > objeto padre se construye, sino queda a que lo tengamos presente en > todos los constructores. Esto solo es problema si la composicion la > hacemos con un puntero, para miembros o referencias no es problema. > > Usar herencia privada es un infinitesimal mas optimo en uso de > memoria ya que nos ahorramos el puntero al objeto que seria padre. > (Esto solo lo use programando para celulares donde cada byte cuenta). > Tambien se ahorra una indireccion(this->a vs this->miembro->a), pero > esta optimizacion nunca la use. > > Saludos > > On Sat, Feb 14, 2009 at 1:04 PM, Juan De Vincenzo > <[email protected]> wrote: > > 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://en.wikipedia.org/wiki/Inheritance_%28computer_science%29> > >>>> > >>>> 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 > > > > _______________________________________________ > 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
