繁体   English   中英

成员函数指针转换

[英]member function pointer conversion

#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编译并输出“ mm”。 但是为什么这可以工作呢? 实际上,A类没有定义任何功能。 似乎类可以通过这种方式使用其基类或派生类函数,即使它没有定义它们。

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

无论如何,它可能起作用的可能原因是函数B::m不会触碰this指针,因此在错误类型的对象上调用它时,它不会“注意”。 另外, AB不是多态的,因此取消引用成员指针并进行调用不需要检查任何vptr。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM