Ver Mensaje Individual
  #4 (permalink)  
Antiguo 16/04/2016, 00:42
enrieto
 
Fecha de Ingreso: abril-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 5
Respuesta: Override en declaración.

Hola
Cita:
¿De que manera se puede hacer esto en C++ sin tener que hacer una clase para cada modificación de la clase base?
Bueno, con cada new Base(){... estás creando una nueva clase derivada anónima para cada modificación de la clase base.

Pero de todos modos, en C++, como supongo que en Java o en cualquier otro lenguaje, hay más de una manera de resolver un problema, y cada forma tendrá sus consideraciones, incluida la tan reputada "es la primera basura que se me ocurrió y quedó así".

Pensando en seguir esa línea, y creando una nueva clase derivada para cada modificación de la clase base y suponiendo que la clase Base no se puede tocar (premisa básica, creo, porque si se pudiera modificar no estaríamos dando esta vuelta), se me ocurre que podría tratar de imitarse con algo así:

Creando una clase Derivada y pasándole a cada objeto creado la función que debe usar para sobrescribir metodo():

Código C++:
Ver original
  1. #include <iostream>
  2. #include <functional>
  3. #include <memory>
  4.  
  5. class Base {
  6. public:
  7.     virtual void metodo() { std::cout << "metodo() en Base.\n"; }
  8.     virtual ~Base() {}
  9. };
  10.  
  11.  
  12. class Derivada : public Base {
  13. public:
  14.     void set_metodo(std::function<void(void)> f) { fun = f; }
  15.     void metodo() override { fun(); }
  16. private:
  17.     std::function<void(void)> fun;
  18. };
  19.  
  20.  
  21. int main()
  22. {
  23.     std::unique_ptr<Base> d1(new Derivada);
  24.     (dynamic_cast<Derivada*>(d1.get()))->set_metodo([] { std::cout << "metodo() en d1.\n"; });
  25.  
  26.     std::unique_ptr<Base> d2(new Derivada);
  27.     (dynamic_cast<Derivada*>(d2.get()))->set_metodo([] { std::cout << "metodo() en d2.\n"; });
  28.  
  29.     d1->metodo();
  30.     d2->metodo();
  31.  
  32.     // también, las clases derivadas se pueden definir en el cuerpo de la función.
  33.     struct : Base {
  34.         void metodo() override { std::cout << "metodo() sobrescrito en d.\n"; }
  35.     } d;
  36.     d.metodo();
  37.  
  38.     struct : Base {
  39.         void metodo() override { std::cout << "metodo() sobrescrito en e.\n"; }
  40.     } e;
  41.     e.metodo();
  42. }

Última edición por enrieto; 16/04/2016 a las 01:10