在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上调用的。但是,我还没有找到办法做到这一点。有可能吗?
(除了编写一个新的非虚函数的繁琐的手工方式,它进行单态调用,然后获得指向它的指针。)
答案 0 :(得分:10)
这可能在GCC中,但它在C ++语言扩展部分中记录的方式表明没有可移植的方法来实现它。
你可以做两件事:
答案 1 :(得分:0)
换句话说:你想作弊。
不,这是不可能的,因为这是多态性与指向成员方法的指针相结合的方式。
答案 2 :(得分:0)
详细说明包装器函数的代码示例(尽管OP想要避免使用此方法!),因为在许多情况下,这是一个实用的解决方案:
#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; }
};
void monomorphicFooFoo( Foo * f ) { f->Foo::foo(); }
int main()
{
Foo *foo = new Foo2;
void (*baseFoo)( Foo * ) = &monomorphicFooFoo;
baseFoo( foo ); // Prints 1
}