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?
Sweet. Fonctionne comme un charme. Merci! – OldPeculier
Désolé, je n'ai pas compris. Comment pouvez-vous un membre peut fonctionner sans objet? – balki
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