Я пытаюсь использовать 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();
}
Если так, какой синтаксис?
Что ж, &Base::foo
указатель на функцию-член И нет никакого способа использовать указатель на функцию-член, который не вызывает виртуальное переопределение. Единственный синтаксис, который избегает виртуальных переопределений, это тот, в котором имя класса, имя функции и список аргументов находятся в одном выражении.
Но если у вас есть std::bind
у вас, вероятно, также есть лямбды, так что, возможно, вы могли бы использовать:
auto baseMethod = [this](){ return Base::foo(); };
//...
baseMethod();
Других решений пока нет …