c++ - 成员函数指针转换

标签 c++ pointer-to-member

#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。

关于c++ - 成员函数指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324440/

相关文章:

c++ - 将成员函数指针转换为 TIMERPROC

c++ - 指向未指定类类型的成员函数指针 - 这可能吗?

C++:通过基类中定义的函数指针从派生调用函数

c++ - 函数指针 - 明显调用的括号前面的表达式必须具有(指向)函数类型

c++ - 在 C++ 上使用 Levensthein 算法创建多距离矩阵

C++:灰度位图头和活绘+opencv图像处理

c++ - 整数计数{0}。我可以在 C++ 中使用花括号初始化变量吗?

c++ - 如何防止将 `#warning` 消息视为错误?

c++ - 使用指定的分隔符逐行解析文本文件

c++ - 使常规函数用模板包装成员函数