2013-01-18 10 views
8

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?

Antwort

14

Nun, &Base::foo ist ein Mitgliedsfunktionszeiger. Und es gibt keine Möglichkeit, einen Memberfunktionszeiger zu verwenden, der keine virtuelle Überschreibung aufruft. Die einzige Syntax, die virtuelle Überschreibungen vermeidet, ist diejenige, bei der Klassenname, Funktionsname und Argumentliste alle denselben Ausdruck haben.

Aber wenn Sie std::bind haben, werden Sie wahrscheinlich auch lambdas haben, vielleicht könnten Sie:

auto baseMethod = [this](){ return Base::foo(); }; 
//... 
baseMethod(); 
+0

Süße. Klappt wunderbar. Vielen Dank! – OldPeculier

+0

Sorry, ich habe es nicht verstanden. Wie kann ein Mitglied ohne ein Objekt funktionieren? – balki

+1

Dieser Lambda-Ausdruck funktioniert nur in einer Elementfunktion von 'Base' oder' Derived' (oder einer anderen Unterklasse von 'Base') und erfasst' this'. – aschepler