Ver Mensaje Individual
  #8 (permalink)  
Antiguo 16/04/2016, 15:06
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Override en declaración.

Cita:
Iniciado por tonyasura
Respecto a ella, esas formas de overrides han sido las que he encontrado por internet. En todas ellas te ha sido necesario crear una nueva clase para hacer el override. En Java se puede hacer algo asi:
Java y C++ se parecen tanto como el agua y el aceite. En C++ se pueden hacer cosas imposibles en Java y viceversa. No se pueden comparar con tanto detalle porque hay áreas que directamente no son comparables.

Si no quieres tener herencia puedes usar templates:

Código C++:
Ver original
  1. template<class T>
  2. struct Base
  3. {
  4.   std::string Func()
  5.   { return T::func(); }
  6. };
  7.  
  8. struct Func1
  9. {
  10.   static std::string func()
  11.   { return "func1\n"; }
  12. };
  13.  
  14. struct Func2
  15. {
  16.   static std::string func()
  17.   { return "func2\n"; }
  18. };
  19.  
  20. int main()
  21. {
  22.   Base<Func1> f1;
  23.   Base<Func2> f2;
  24.  
  25.   std::cout << f1.Func();
  26.   std::cout << f2.Func();
  27. }

También se puede usar un functor para especificarle a la una parte del algoritmo (en la línea de lo comentado por enrieto):

Código C++:
Ver original
  1. struct Base
  2. {
  3.   std::string Func(std::function<std::string()> func)
  4.   { return func(); }
  5. };
  6.  
  7. std::string miFunc()
  8. { return "algo\n"; }
  9.  
  10. int main()
  11. {
  12.     Base b;
  13.    
  14.     std::cout << b.Func(miFunc);
  15. }

Los dos ejemplos anteriores se pueden complicar hasta límites insospechados con tal de adaptarlos a las necesidades específicas de un proyecto.

Cita:
Iniciado por tonyasura
Ese codigo me sirvio de algo. Ahora tengo otra pequeña duda.
Código C++:
Ver original
  1. class Base {
  2.     virtual void metodo() {
  3.       Serial.println("codigo original");
  4.     }
  5.  
  6. };
  7.  
  8. Base BaseAmbitoGlobal;
  9.  
  10. void setup() {
  11.   Serial.begin(9600);
  12.  
  13.   struct : Base {
  14.     void metodo() override {
  15.       Serial.println("codigo override");
  16.     }
  17.   } b;
  18.  
  19. c = Base BaseAmbitoGlobal;<-------------------------???
  20.  
  21. }
  22.  
  23. void loop() {
  24.   b->metodo();
  25.   delay(1000);
  26. }
Varios errores tienes en ese código:
  • En la línea que marcas, c no está definida. El compilador no va a saber qué es eso y va a dar error.
  • En la línea que marcas, Base BaseAmbitoGlobal está mal. Si quieres hacer una asignación únicamente has de indicar las variables implicadas: c = BaseAmbitoGlobal;
  • b->metodo();: Esta línea también tiene un problema y es que b no solo no existe en ese ámbito sino que además la que sí existe, no solo no es un puntero sino que al estar metida dentro de una función nunca va a ser accesible desde fuera.

Las variables globales son algo a evitar ya que las relaciones se pierden y se hace imposible implementar mecanismos de acceso y control.

Si tu idea es cambiar, en tiempo de ejecución, el algoritmo a ejecutar dentro de Base::metodo lo ideal es usar un std::function y pasarle dicho objeto a Base para que pueda modificar su comportamiento:

Código C++:
Ver original
  1. class Base
  2. {
  3.   public:
  4.  
  5.     Base()
  6.       : _func(Base::metodoImpl)
  7.     { }
  8.  
  9.     void metodo()
  10.     {
  11.       _func();
  12.      }
  13.  
  14.     void SetCustomFunc(std::function<void(void)> customFunc)
  15.     {
  16.       _func = customFunc;
  17.     }
  18.  
  19.   private:
  20.  
  21.     std::function<void(void)> _func;
  22.  
  23.     static void metodoImpl()
  24.     { std::cout << "metodoImpl" << std::endl; }
  25. };
  26.  
  27. void alternativa()
  28. { std::cout << "alternativa" << std::endl; }
  29.  
  30. int main()
  31. {
  32.     Base b;
  33.     b.metodo();
  34.    
  35.     b.SetCustomFunc(alternativa);
  36.     b.metodo();
  37. }

Cita:
Iniciado por enrieto Ver Mensaje
Así que el objeto d del ejemplo es de un tipo anónimo derivado de Base.
Pero reconoce que eso te ha funcionado de casualidad jejejejeje.

Lo normal es no encontrar declaraciones de ese estilo en C++ porque pueden ser bastante problemáticas. Ya es complicado de por sí dominar el lenguaje como para andar poniéndonos trabas cada dos por tres.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.