gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:14:53 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com