Указатель на виртуальную функцию все еще вызывается виртуально? - PullRequest
6 голосов
/ 19 ноября 2010

Будет ли действительным указатель на функцию-член класса, которая объявлена ​​виртуальной?

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 ]

5 голосов
/ 19 ноября 2010

Да. Действительный код для тестирования на кодовой панели или ideone :

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);
}
2 голосов
/ 19 ноября 2010

Да.Это также работает с виртуальным наследованием.

0 голосов
/ 19 ноября 2010

Лучший тест для этого - сделать методы класса А чисто виртуальными.В обоих случаях (с или без чисто виртуальных методов) будет вызвана функция B ::.

0 голосов
/ 19 ноября 2010

Функция будет вызвана, так как вы просто пытаетесь вызвать унаследованную функцию.

...