C ++では、クラスの(非静的)メンバー関数へのポインターを取得し、後でそれをオブジェクトで呼び出すことができます。関数が仮想の場合、呼び出しはオブジェクトの動的タイプに応じて動的にディスパッチされます。使用するバージョンを含むスコープを明示的に指定することにより、(メンバーポインターを使用せずに)オブジェクトの仮想メンバー関数を単相的に呼び出すこともできます。次のコードはこれを示しています。
#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
}
私がやりたいのは、2つを組み合わせて、メンバー関数の単相バージョンへのポインターを取得することです。つまり、Foo :: fooへのポインタが必要です。これは、常にfooの基本クラスバージョンを呼び出し、Foo2で呼び出された場合でも1を出力します。しかし、私はこれを行う方法を見つけることができませんでした。出来ますか?
(単相呼び出しを行う新しい非仮想関数を手動で記述し、それへのポインターを取得するという面倒な手動の方法を除きます。)