是否有可能获得指向纯虚函数定义的指针?

时间:2012-04-27 19:14:59

标签: c++ virtual-functions member-function-pointers pure-virtual

  

可能重复:
  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

(为了记录,我实际上并不需要这样做。我只是好奇。)

1 个答案:

答案 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类,那么您可以将您想要访问的功能分解为非覆盖的。