PDA

Ver la versión completa : Programacion en C++



thamurath
15/11/2007, 16:56
Quizas esta pregunta sea un poco offtopic, pero llevo un par de horas buscando y estoy un poco desesperado, y como se que por aqui hay gente que controla de c++ lo mismo me podeis ayudar. En cualquier caso pido disculpas si este mensaje no esta en el sitio adecuado.

La cuestion es que estoy buscando alguna manera de que cuando una funcion hija intente sobreescribir un metodo de la funcion base le de un error o al menos un warning. Esto en java se consigue declarando el metodo como
final pero en c++ no se como hacerlo.

Por si a alguno le sirve de algo es para la implementacion del Template Method Pattern en c++

Gracias por adelantado.

Aiken
15/11/2007, 21:27
pues no es que yo sea muy experto en C++, pero esto que dices nunca me lo habia planteado, pero me ha picado la curiosidad y he estado buscando.

He encontrado una web (en ingles) que lo mismo te es muy util, pues te dice como hacer las cosas que estas acostumbrado en Java en C++ y al reves.

Tambien te da un listado de las cosas que tiene un lenguaje y otro no.

http://www4.ncsu.edu/~kaltofen/courses/Languages/JavaExamples/cpp_vs_java/

Por desgracia los methodos 'final' aparece en el listado de cosas que c++ no tiene :( y tampoco indica ningun truco posible para hacer algo similar :(

Bueno, aun asi echale un vistazo a la url que parece interesante y lo mismo te da alguna idea ;) :brindis:

Aiken

< - >
He seguido buscando y he encontrado esto:
http://www.thescripts.com/forum/thread60997.html

parece que dice que la solucion es un non-virtual method, que yo no estoy muy puesto pero
diria que un non-virtual es precisamente un metodo normal :confused:

parece ser que dice que la confusion viene de que una clase derivada puede "redefinir" un metodo, pero no lo puede "sobreescribir". no se si eso te dara alguna pista.

y esto otro me hace pensar que no se puede hacer nisiquiera con un non-virtual


Unlike C++ non-virtual methods, Java final methods cannot be overridden in a derived class. This rule allows Java to retain the guarantee about always using the appropriate method implementation when calling through a reference.


bueno ahi queda eso, ;)
Aiken

swapd0
15/11/2007, 22:32
Que yo sepa no se puede hacer.

thamurath
16/11/2007, 08:58
Gracias por la informacion Aiken,

Efectivamente yo tambien he estado buscando y no he encontrado algo, asi que o bien no se puede hacer o bien el "workaround" para conseguirlo es demasiado arcano. Hay muchas cosas para las que c++ no esta diseñado especificamente, sin embargo el hecho de que sea un lenguaje muy abierto permite hacerlas de maneras digamos, poco convencionales, por ejemplo no hay una manera directa de hacer una clase sealed ( o final en java ) en c++ y sin embargo se puede hacer "abusando" del friend.

En cuanto a las "non-wirtual functions", efectivamente son las funciones normales, y el "problema" es que el hecho de que una clase hija sobreescriba una funcion de la clase base que no es virtual no implica ningun tipo de error ( al menos no para el compilador, aunque seguramente exista un error de concepto), ni siquiera un warning ( esto es asi al menos en el vs2005), de manera que un programador algo despistado puede no darse cuenta de su error.



Mirare con atencion los links que me has pasado por si encuentro algo mas que me sea de utilidad, en cualquier caso gracias y si algun dia encuentro la solucion te lo hare saber.

Un saludo!

Gammenon
16/11/2007, 09:50
Un warning creo que debiera dartelo el VC++ 2005. Prueba a cambiar el nivel de warning al más exigente. Lo de hacer una función virtual "final" o "sealed", hasta donde yo se, no es posible.

Zheo
18/11/2007, 18:35
Por si a alguno le sirve de algo es para la implementacion del Template Method Pattern en c++
Qué problema tienes en implementar ese PD sin métodos final?

dr_bacterio
20/11/2007, 09:28
Precisamente en gamedev han sacado un articulo sobre el tema de las "sealed" , por si le quereis hechar un vistazo:
http://www.gamedev.net/reference/programming/features/cppseal/

Enga saludos peña :brindis:

Zheo
20/11/2007, 15:40
Precisamente en gamedev han sacado un articulo sobre el tema de las "sealed" , por si le quereis hechar un vistazo:
http://www.gamedev.net/reference/programming/features/cppseal/

Enga saludos peña :brindis:
Muy bueno el artículo: es muy interesante y con una solución sencilla de implementar.

Aunque eso me da ideas respecto a la solución del problema de derivar de una clase ya sellada y de sealed en el artículo. Quizá en vez de macros se podría hacer con templates.

Habrá que mirarlo