#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类没有定义任何功能。 看起来这个类可以通过这种方式使用它的基类或派生类函数,即使它没有定义它们。
答案 0 :(得分:2)
由于A
不包含f
引用的成员,因此行为未定义。
无论如何它可能起作用的可能原因是函数B::m
没有触及this
指针,所以它没有&#t;#34;注意&#34;当它调用错误类型的对象时。此外,A
和B
不是多态的,因此取消引用指向成员的指针并且调用不需要检查任何vptr。