成员函数指针转换

时间:2015-12-17 00:03:54

标签: c++ member-function-pointers

#include <iostream>
using namespace std;


class A {
};
typedef void (A::*funA)(int);

class B : public A {
public:
void m(int) {std::cout << "mm" << std::endl; }
void n(int) { std::cout << "nn"<<std::endl; }   
};
typedef void (B::*funB)(int);

class C : public B {
public:
void g(int) {std::cout << "gg" << std::endl; }
void h(int) { std::cout << "hh"<<std::endl; }
};
typedef void (C::*funC)(int);

int main() {
funB f = static_cast<funB>(&C::m);
A* pa = new A;
(pa->*(static_cast<funA>(f)))(2);
return 0;
}

gcc编译输出&#34; mm&#34;。 但为什么这可行呢?事实上,A类没有定义任何功能。 看起来这个类可以通过这种方式使用它的基类或派生类函数,即使它没有定义它们。

1 个答案:

答案 0 :(得分:2)

由于A不包含f引用的成员,因此行为未定义。

无论如何它可能起作用的可能原因是函数B::m没有触及this指针,所以它没有&#t;#34;注意&#34;当它调用错误类型的对象时。此外,AB不是多态的,因此取消引用指向成员的指针并且调用不需要检查任何vptr。