Tengo una plantilla de clase donde algunos métodos se definen como virtuales para dar la posibilidad al usuario de mi clase de darles una implementación en su clase derivada. Tenga en cuenta que en mi clase de plantilla hay algunos métodos no virtuales que hacen uso del virtual (se llama a una clase virtual que debe devolver un valor en una clase no virtual).override C++ virtual method
¿Puede darme un ejemplo simple de un código correcto donde el método virtual de la clase padre debe devolver un valor (pero su implementación se proporciona en una clase hija) y el valor devuelto por el método virtual en la clase padre se usa en otros métodos de esa clase. Porque vi en alguna parte (por ejemplo aquí: Safely override C++ virtual functions) que esto puede causar algunos problemas y el método definido por el usuario anulará el método virtual de la clase padre.
Nota: programo con Code :: Blocks usando el compilador g ++.
EDIT: conforme a lo solicitado aquí un simple ejemplo de lo que quiero:
template<typename T>
class parent {
public:
// Public methods that user can call
int getSomething(T t);
void putSomething(T t, int x);
// public method that user should implement in his code
virtual float compute(T t) { }
// protected or private methods and attributes used internally by putSomething ...
float doComplexeThings(...); // this can call
};
El cómputo método() debe ser aplicada por el usuario (la clase hija). Sin embargo, este método compute() es llamado por putSomething() y doComplexeThings() por ejemplo.
Por lo que describes, es posible que no se necesite un método virtual (el polimorfismo estático puede funcionar para ti): difícil de decir según tu descripción. Por favor, publique el código de muestra que ha escrito para tener una mejor idea de lo que está tratando de hacer. – kfmfe04
El ejemplo en la pregunta vinculada era sobre lo que crees que es una anulación, pero en realidad declara una sobrecarga debido a un error, p. falta un const y no se trata de valores devueltos. ¿Cuál crees que es el peligro, exactamente? – CashCow
En el código de plantilla clásico, ni siquiera necesita declarar un 'cálculo de flotación virtual (T t)'. Simplemente utilícelo (llámelo) dentro de putSomething() y doComplexeThings() a través de 't.compute()', si tiene un control para la instancia. El compilador generará un error si su clase T no implementa el cálculo. De esta manera, el padre y T en realidad ni siquiera tienen que vivir en la misma jerarquía de herencia: es decir, T es una relación hijo de padre no es necesaria. Hacerlo también puede darle la oportunidad de darle a los padres un nombre más significativo (ya que la relación is-a no es necesaria). – kfmfe04