在 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
}
我想做的是将两者结合起来,并获得一个指向成员函数的单态版本的指针;即,我想要一个指向 Foo::foo 的指针,它总是调用 foo 的基类版本,并打印 1,即使它是在 Foo2 上调用的。但是,我还没有找到一种方法来做到这一点。可能吗?
(除了繁琐的手动编写一个新的非虚拟函数来进行单态调用,然后得到一个指向它的指针。)