2

可能重复:
使用函数指针调用虚成员函数的基类定义

给定以下层次结构:

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

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

4

1 回答 1

2

正如詹姆斯麦克内利斯评论的那样,简短的回答就是“不”。

更长的答案是,“如果你愿意接受一些正式的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 事件)。

Note that if you control the Base class, then you can just factor out the functionality that you want to be accessible non-overridden.

于 2012-04-27T19:59:40.063 回答