8

J'essaie d'utiliser std :: bind() pour créer une fonction qui appellera la version de classe de base d'une fonction virtuelle plutôt que d'appeler la version de la classe dérivée.Comment utiliser std :: bind() pour appeler la version de la classe de base d'une fonction virtuelle?

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; 
} 

Je comprends de elsewhere que vous ne pouvez pas appeler normalement une fonction de base d'une manière telle que « anti-virtuel » cela. L'exception évidente est le paradigme commun:

void Derived::bar() { Base::bar(); } 

Depuis l'expression Base::bar() est reconnu comme « anti-virtuel » (au sens où je fais allusion) dans les méthodes dérivées, est-il possible de se lier à Base::bar() dans le chemin désiré de dans une des méthodes de Derived? Par exemple. quelque chose comme:

void Derived::bar() 
{ 
    auto baseMethod = std::bind(&Base::foo, this); 
    baseMethod(); 
} 

Si oui, quelle est la syntaxe?

Répondre

14

Eh bien, &Base::foo est un pointeur de fonction membre. Et il n'existe aucun moyen d'utiliser un pointeur de fonction membre qui n'appelle pas un remplacement virtuel. La seule syntaxe qui évite les remplacements virtuels est celle où le nom de la classe, le nom de la fonction et la liste des arguments sont tous dans la même expression.

Mais si vous avez std::bind, vous avez probablement aussi lambdas, vous pourriez peut-être utiliser:

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

Sweet. Fonctionne comme un charme. Merci! – OldPeculier

+0

Désolé, je n'ai pas compris. Comment pouvez-vous un membre peut fonctionner sans objet? – balki

+1

Cette expression lambda ne fonctionne que dans une fonction membre de 'Base' ou' Derived' (ou une autre sous-classe de 'Base'), et capture' this'. – aschepler

Questions connexes