C ++指向虚函数的指针

时间:2011-07-19 22:18:27

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

如果你有像这样的结构

struct A {
    void func();
};

和像这样的参考

A& a;

你可以像这样得到一个指向func方法的指针:

someMethod(&A::func);

现在如果该方法是虚拟的并且您不知道它在运行时是什么怎么办?为什么你不能得到像这样的指针?

someMethod(&a.func);

是否可以获得指向该方法的指针?

3 个答案:

答案 0 :(得分:26)

指向成员的指针考虑了他们所指向的功能的虚拟性。 例如:

#include <iostream>
struct Base
{
    virtual void f() { std::cout << "Base::f()" << std::endl; }
};

struct Derived:Base
{
    virtual void f() { std::cout << "Derived::f()" << std::endl; }
};


void SomeMethod(Base& object, void (Base::*ptr)())
{
    (object.*ptr)();    
}


int main()
{
    Base b;
    Derived d;
    Base* p = &b;
    SomeMethod(*p, &Base::f); //calls Base::f()
    p = &d;
    SomeMethod(*p, &Base::f); //calls Derived::f()    
}

输出:

Base::f()
Derived::f()

答案 1 :(得分:10)

调用函数指针的方法是提供其对象的实例指针。这将解决所有虚拟问题:

struct A { void func(); };

int main()
{
  typedef void (A::*mf)();

  A x; // irrelevant if A is derived or if func is virtual

  mf f = &A::func;   // pointer-to-member-function
  A* p = &x;         // pointer-to-instance

  (p->*f)();           // invoke via pointer
  (x.*f)();            // invoke directly
}

好的,有趣的 语法挑战 问题:假设我有这个。

struct Basil { virtual void foo(); virtual ~Basil(); };
struct Derrek : public Basil { virtual void foo(); };

现在,如果我有Derrek * pBasil * p,我可以通过Basil调用p->Basil::foo()成员。如果我获得了void(Derrek::*q)() = &Derrek::foo,我怎么能这样做?

答案:无法完成。单独的PMF q不知道它是否指向虚函数,更不用说哪一个,并且它不能用于在运行时查找基类函数。 [感谢Steve和Luc!]

答案 2 :(得分:0)

您可以获得指向它的指针,如下所示:

struct A {
    virtual void foo() = 0;
};

typedef void (A::*LPFOO)();

LPFOO pFoo = &A::foo;