Considere el siguiente código.Llamar a una función virtual estáticamente a través de un puntero a la función
#include <iostream>
#include <memory>
struct A {
A() {}
virtual void f() {
std::cout << "A::f" << std::endl;
}
private:
A(const A&);
};
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
call(&A::f);
}
private:
void call(void (A::*aMethod)()) {
// ...
(static_cast<A&>(*this).*aMethod)();
//(static_cast<A>(*this).*aMethod)(); -> not allowed to copy!
// ...
}
};
void main() {
std::auto_ptr<B> b (new B);
b->f();
}
Este código llama de forma recursiva el mismo método B::f
hasta que se agote la pila, mientras que me gustaría que el método call
llamar A::f
. Es decir, se debe llamar de forma estática, ya que normalmente pasaría si hubiera escrito simplemente:
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
// ...
A::f();
// ...
}
};
La razón por la que quieren tener el método call
es factorizar algún código antes y después de la 'llamada estática' que es común a varios métodos con la misma firma como f
...
¿Cómo puedo estáticamente llamar a una función virtual decidió en tiempo de ejecución?
En 'B :: F', ¿por qué tiene que llamar a la función a través de' call' y un puntero de función? ¿Por qué no puedes hacer 'A :: f();'? (Refactorizar el código "antes" y "después" en algunas funciones comunes o en una clase común.) –
Eso es probablemente lo que tendré que hacer ... El método 'llamada' estaba aquí para factorizar el código, pero tenía no di cuenta de que no sería capaz de utilizarlo como tenía la intención de ... –