В С++ можно получить указатель на (нестационарную) функцию-член класса, а затем вызвать его на объект. Если функция была виртуальной, вызов динамически отправляется динамически в зависимости от динамического типа объекта. Также возможно (не используя указатель-член) для вызова виртуальных функций-членов объектов мономорфно, явно предоставляя область, содержащую используемую версию. Следующий код демонстрирует это:
#include <iostream>
using std::cout; using std::endl;
struct Foo
{
virtual void foo() { cout << 1 << endl; }
};
struct Foo2: public Foo
{
virtual void foo() { cout << 2 << endl; }
};
int main( int, char** )
{
Foo *foo = new Foo2;
void (Foo::*foo_pointer)() = &Foo::foo;
foo->foo(); // prints 2
foo->Foo::foo(); // prints 1
(foo->*foo_pointer)(); // prints 2
}
Что я хотел бы сделать, это объединить эти два и получить указатель на мономорфную версию функции-члена; то есть я хочу указатель на Foo:: foo, который всегда вызывает версию базового класса foo и печатает 1, даже если он вызывается на Foo2. Однако я не смог найти способ сделать это. Возможно ли это?
(Помимо утомительного ручного способа написания новой не виртуальной функции, которая делает мономорфный вызов, а затем получения указателя на это.)