指向虚函数的指针仍然会被虚拟调用吗?

发布于 2024-10-03 05:58:50 字数 364 浏览 6 评论 0原文

指向声明为 virtual 的类成员函数的函数指针有效吗?

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

Will a function pointer to a class member function which is declared virtual be valid?

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);

Will B::function be called?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

如歌彻婉言 2024-10-10 05:58:50

是的。在 codepad

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);
}

Yes. Valid code to test on codepad or 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);
}
二智少女猫性小仙女 2024-10-10 05:58:50

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

Yes. It also works with virtual inheritance.

小草泠泠 2024-10-10 05:58:50

当您尝试调用继承的函数时,该函数将被调用。

The function will be called, as you just try to invoke inherited function.

拥有 2024-10-10 05:58:50

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

The best test for that thing is to make the methods in the class A a pure virtual method. In both cases (with or without pure virtual methods), B::function will be called.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文