Ho una situazione in cui voglio un puntatore di funzione membro a una funzione virtuale che evita l'invio dinamico. Vedi sotto:Implementazione della funzione membro della base di chiamata tramite il puntatore della funzione membro alla funzione virtuale
struct Base
{
virtual int Foo() { return -1; }
};
struct Derived : public Base
{
virtual int Foo() { return -2; }
};
int main()
{
Base *x = new Derived;
// Dynamic dispatch goes to most derived class' implementation
std::cout << x->Foo() << std::endl; // Outputs -2
// Or I can force calling of the base-class implementation:
std::cout << x->Base::Foo() << std::endl; // Outputs -1
// Through a Base function pointer, I also get dynamic dispatch
// (which ordinarily I would want)
int (Base::*fooPtr)() = &Base::Foo;
std::cout << (x->*fooPtr)() << std::endl; // Outputs -2
// Can I force the calling of the base-class implementation
// through a member function pointer?
// ...magic foo here...?
return 0;
}
Per i curiosi, il motivo per cui voglio che questo è perché l'implementazione della classe derivata sta usando una classe di utilità per Memoize (aggiungere una cache in giro) l'implementazione della classe base. La classe di utilità utilizza un puntatore a funzione, ma, naturalmente, il puntatore di funzione viene inviato dinamicamente alla classe più derivata e ottengo una ricorsione infinita.
C'è una sintassi che mi consente di riprodurre il comportamento di invio statico che posso ottenere con x->Base::foo()
ma tramite un puntatore di funzione?
Interessante ... ma questo in realtà chiama la Bas Il costruttore di copie è quindi applicabile solo in alcuni casi. Se Base ha un costruttore di copie privato o qualsiasi funzione virtuale pura, questa soluzione non verrà applicata. – SimonD