Ich versuche, std :: bind() zu verwenden, um eine Funktion zu erstellen, die die Basisklassenversion einer virtuellen Funktion aufruft, anstatt die abgeleitete Klassenversion aufzurufen.Wie verwende ich std :: bind(), um die Version der Basisklasse einer virtuellen Funktion aufzurufen?
struct Base
{
virtual void foo() { cout << "Base\n"; }
};
struct Derived : public Base
{
virtual void foo() { cout << "Derived\n"; }
};
int main(int argc, const char * argv[])
{
Base* base = new Derived;
auto baseMethodHopefully = std::bind(&Base::foo, base);
baseMethodHopefully(); // Want call to Base::foo(), but get call to Derived::foo().
return 0;
}
Ich verstehe von elsewhere, dass Sie eine Basisfunktion in einer „anti-virtuelle“ Art und Weise, wie dies normalerweise nicht nennen kann. Die offensichtliche Ausnahme ist das gemeinsame Paradigma:
void Derived::bar() { Base::bar(); }
Da der Ausdruck Base::bar()
als „anti-virtuelle“ erkannt wird (in dem Sinne, ich anspielend) innerhalb Methoden abgeleitet, ist es möglich, Base::bar()
in die binden gewünschter Weg von innerhalb eine der Methoden von Derived? Z.B. etwas wie:
void Derived::bar()
{
auto baseMethod = std::bind(&Base::foo, this);
baseMethod();
}
Wenn ja, was ist die Syntax?
Süße. Klappt wunderbar. Vielen Dank! – OldPeculier
Sorry, ich habe es nicht verstanden. Wie kann ein Mitglied ohne ein Objekt funktionieren? – balki
Dieser Lambda-Ausdruck funktioniert nur in einer Elementfunktion von 'Base' oder' Derived' (oder einer anderen Unterklasse von 'Base') und erfasst' this'. – aschepler