可能重复:
Calling base class definition of virtual member function with function pointer
给出以下层次结构:
struct Base
{
virtual void f() = 0;
};
void Base::f()
{
cout << "Base::f\n";
}
struct Derived : Base
{
void f()
{
cout << "Derived::f\n";
}
};
我们可以像这样强制拨打Base::f
:
Derived d;
d.Base::f();
或:
Base * b = &d;
b->Base::f();
那里没有惊喜。但是有可能获得一个成员函数指针,通过它可以调用Base::f
吗?
void (Base::*bf)() = &Base::f;
for_each( b, b+1, mem_fn( bf ) ); // calls Derived::f
(为了记录,我实际上并不需要这样做。我只是好奇。)
答案 0 :(得分:2)
正如James McNellis评论的那样,简短的回答只是“不”。
答案越长,“如果你愿意接受一些正式的 UB,那么”:
#include <iostream>
#include <algorithm> // for_each
#include <functional> // mem_fn
using namespace std;
struct Base
{
virtual void f() = 0;
};
void Base::f()
{
cout << "Base::f\n";
}
struct Derived : Base
{
void f()
{
cout << "Derived::f\n";
}
};
int main()
{
struct DirtyHack: Base
{
void baseF() { Base::f(); }
};
Derived d;
void (Base::*bf)() = static_cast< void(Base::*)() >( &DirtyHack::baseF );
Base* b = &d;
(b->*bf)();
for_each( b, b+1, mem_fn( bf ) ); // calls Base::f
}
我不会这样做,但是,我通常不会使用原始成员函数指针(绑定的是另一个问题,例如GUI事件)。
请注意,如果您控制Base
类,那么您可以将您想要访问的功能分解为非覆盖的。