Mam sytuację, w której chcę wskaźnik funkcji członka do funkcji wirtualnej, która unika dynamicznego wysyłania. Patrz poniżej:Implementacja funkcji członka podstawowego za pomocą wskaźnika funkcji członka do funkcji wirtualnej
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;
}
dla ciekawskich, powodem chcę to dlatego, że pochodzi implementacja klasy stosuje klasę użytkową do memoize (dodać około cache) realizację bazowej klasy. Klasa narzędzi przyjmuje wskaźnik funkcji, ale oczywiście wskaźnik funkcji dynamicznie odsyła do najbardziej wyprowadzonej klasy i otrzymuję nieskończoną rekursję.
Czy istnieje składnia, która pozwala mi odtworzyć zachowanie statyczne wysyłki, które można uzyskać za pomocą x->Base::foo()
, ale za pomocą wskaźnika funkcji?
Ciekawe ... ale to faktycznie wywołuje Bas e Konstruktor kopiowania ma zastosowanie tylko w niektórych przypadkach. Jeśli baza ma prywatny konstruktor kopii lub dowolne czyste funkcje wirtualne, to rozwiązanie nie będzie miało zastosowania. – SimonD