【问题标题】:Does a pointer to a virtual function still get invoked virtually?指向虚函数的指针是否仍然被虚拟调用?
【发布时间】:2010-11-19 18:51:27
【问题描述】:

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

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 会被调用吗?

【问题讨论】:

  • 你有密码。这是您可以通过运行代码自己回答的问题之一。
  • 因为在这里询问比启动 IDE、创建项目、代码、编译、调试等更快...而且它会给其他人带来好处,而且这个问题/代码不会丢失.
  • @Martin:如果行为未定义怎么办?

标签: c++ function virtual function-pointers


【解决方案1】:

是的。在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);
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        最好的测试是让类 A 中的方法成为纯虚方法。在这两种情况下(有或没有纯虚方法),都会调用 B::function。

        【讨论】:

          猜你喜欢
          • 2012-09-21
          • 2021-10-31
          • 2013-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-08
          • 2014-06-24
          相关资源
          最近更新 更多