Как использовать std :: bind () для вызова версии виртуальной функции базового класса?

Я пытаюсь использовать 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();
}

Если так, какой синтаксис?

8

Решение

Что ж, &Base::foo указатель на функцию-член И нет никакого способа использовать указатель на функцию-член, который не вызывает виртуальное переопределение. Единственный синтаксис, который избегает виртуальных переопределений, это тот, в котором имя класса, имя функции и список аргументов находятся в одном выражении.

Но если у вас есть std::bindу вас, вероятно, также есть лямбды, так что, возможно, вы могли бы использовать:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]