Я пытаюсь использовать std :: bind () для создания функции, которая будет вызывать версию виртуальной функции базового класса, а не вызывать версию производного класса.
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;
}
Насколько я понимаю из в другом месте, вы обычно не может вызывать базовую функцию "антивиртуальным" способом, подобным этому. Очевидное исключение - это общепринятая парадигма:
void Derived::bar() { Base::bar(); }
Поскольку выражение Base::bar()
распознается как "антивиртуальное" (в том смысле, о котором я говорю) в методах Derived, возможно ли выполнить привязку к Base::bar()
желаемым способом из внутри одного из методов Derived ? Например. что-то типа:
void Derived::bar()
{
auto baseMethod = std::bind( &Base::foo, this );
baseMethod();
}
Если да, то каков синтаксис?