Dinamik bir gönderimden kaçınan bir sanal işlevle üye işlev işaretçisi istediğim bir durum var. Aşağıya bakın: Merak edenler içinÜye işlev işaretçisi aracılığıyla temel işlev çağrısı işlevini sanal işlevle çağırma
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;
}
, ben türetilmiş sınıf uygulaması memoize için bir yardımcı sınıfını kullanarak bunun nedeni istiyorum nedeni taban sınıfta kullanıma (etrafında bir önbellek ekleyin). Hizmet sınıfı bir işlev işaretçisi alır, ancak, elbette, işlev işaretçisi en türetilmiş sınıfa dinamik olarak gönderir ve sonsuz bir yineleme elde ederim.
x->Base::foo()
ile elde ettiğim statik gönderme davranışını yeniden üretmeme izin veren bir sözdizimi var mı, yoksa bir işlev işaretçisi mi?
ilginç ... ama bu aslında Bas çağırır e kopya kurucu böylece sadece bazı durumlarda uygulanabilir. Base'in özel bir kopya kurucusu veya herhangi bir sanal işlevi varsa, bu çözüm geçerli olmaz. – SimonD