是否仍然虚拟调用指向虚函数的指针?

时间:2010-11-19 18:51:27

标签: c++ function virtual function-pointers

指向虚拟的类成员函数的函数指针是否有效?

class A {
public:
    virtual void function(int param){ ... };
}

class B : public A {
    virtual void function(int param){ ... }; 
}

//impl :
B b;
A* a = (A*)&b;

typedef void (A::*FP)(int param);
FP funcPtr = &A::function;
(a->*(funcPtr))(1234);

是否会调用B::function

4 个答案:

答案 0 :(得分:5)

是。要在codepadideone上测试的有效代码:

class A { 
public: 
    virtual void function(int param){
      printf("A:function\n");
    }; 
};

class B : public A { 
public:
    virtual void function(int param){
      printf("B:function\n");
    };  
}; 

typedef void (A::*FP)(int param);

int main(void)
{
  //impl : 
  B b; 
  A* a = (A*)&b; 

  FP funcPtr = &A::function; 
  (a->*(funcPtr))(1234);
}

答案 1 :(得分:2)

是。它也适用于虚拟继承。

答案 2 :(得分:0)

将调用该函数,因为您只是尝试调用继承的函数。

答案 3 :(得分:0)

对该事物的最佳测试是使A类中的方法成为纯虚方法。在这两种情况下(使用或不使用纯虚方法),将调用B :: function。