首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么成员函数指针不能被相应的成员正确访问?

成员函数指针不能被相应的成员正确访问的原因是因为成员函数指针只包含了函数的地址信息,而没有包含隐含的this指针信息。在C++中,成员函数是依赖于对象的,每个对象都有自己的this指针,用于指向对象本身。而成员函数指针没有这个this指针,所以无法正确访问成员函数。

为了解决这个问题,可以使用std::bind或者lambda表达式来绑定成员函数和对象,从而创建一个可调用的对象,这样就可以正确访问成员函数了。

举个例子,假设有一个类Foo,其中有一个成员函数bar:

代码语言:cpp
复制
class Foo {
public:
    void bar() {
        // 成员函数的实现
    }
};

如果要使用成员函数指针来调用bar函数,会出现问题:

代码语言:cpp
复制
Foo obj;
void (Foo::*funcPtr)() = &Foo::bar;
(obj.*funcPtr)();  // 错误,无法正确访问成员函数

可以使用std::bind来绑定成员函数和对象:

代码语言:cpp
复制
std::bind(&Foo::bar, obj)();

或者使用lambda表达式:

代码语言:cpp
复制
[&obj]() { obj.bar(); }();

这样就可以正确访问成员函数了。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么Java中类成员变量不能重写?成员变量在Java中能够重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量在Java中能够重写么?...Paste_Image.png 按照我们已有的多态概念,第二个应该是输出sub才对,但却输出了super。这是为什么呢?...意思就是: 在一个类中,子类中成员变量如果和父类中成员变量同名,那么即使他们类型不一样,只要名字一样。父类中成员变量都会被隐藏。在子类中,父类成员变量不能简单用引用来访问。...而是,必须从父类引用获得父类隐藏成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。...其实,简单来说,就是子类不会去重写覆盖父类成员变量,所以成员变量访问不能像方法一样使用多态去访问

3.5K40

_类内成员函数可以访问本类对象私有成员

类内成员函数可以访问本类对象私有成员 sList是一个类 私有成员是head,有一个成员函数形参是本类对象(引用,引不引用不影响结论和原因) ==为什么呢!...head明明是b私有成员为什么可以访问了!!??== 因为!...对象b是sList类,而这个intersection函数是sList成员函数 head虽然是sList类对象私有成员,但是是在sList类内访问 ==就是 在类内访问了本类(实例化对象)私有成员...本来就是类成员,只是抽象和实例化问题 这非常合理地体现了 类 封装性 这个就是不行,在类外访问了 这一点是非常好用,可以利用这一点 ==用成员函数肆无忌惮地访问对象私有成员!...==只要声明函数是类成员函数,将外部同类对象设为形参(或加个引用)就可以了!! 不必再为如何访问到同类外部对象私有成员而苦思了!

82230

VC和GCC成员函数指针实现研究(二)

、接上一篇 VC和GCC内成员函数指针实现研究(一) 接下来是多重继承,用到测试代码如下所示: #include #include #include <algorithm...*ptr)(); return 0; } VC多重继承成员函数指针实现 image.png 图八:VC多重继承指针赋值操作 赋值部分和单继承是一样。...GCC多重继承成员函数指针实现 image.png 图十二:GCC多重继承函数指针赋值 哈,GCC多重继承赋值部分也和单继承一样,那么调用呢?...image.png 图十三:GCC多重继承函数指针调用 如上图所示,比单继承多了两行,第一行是调整虚表地址到foo_b,这点和VC一样。后面增加add指令是调整成员函数this指针地址。...下一篇 VC和GCC成员函数指针实现研究(三)

66120

【C++】C++ 类中 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

使用 const 关键字 修饰成员函数 , 会将 成员函数 转化为 " 常量成员函数 " ; " 常量成员函数 " 中 操作限制 : 不能修改成员变量 : 不能修改 任何 成员变量 值 , 静态成员变量...与 非静态普通成员变量 都不能修改 ; 不能调用非常量成员函数 : 只能调用 " 常量成员函数 " , 不能调用 非常量成员函数 , 以保证不会修改 成员变量 ; " 常量成员函数 " 只能访问 常量成员变量...其它常量成员函数 如果类 成员变量 不是 常量 , 那么 " 常量成员函数 " 不能访问它们 ; public: int age; // 年龄 int height; // 身高 如果类...成员变量 是 常量 , 那么 " 常量成员函数 " 可以访问它们 , 注意 : 只能访问 , 不能修改 ; public: const int age; // 年龄 const int height...; // 身高 如果 成员函数 const 关键字 声明为 常量成员函数 , 则在该函数不能修改 类对象中 任何成员变量 ; class Student { public: void fun

17920

VC和GCC内成员函数指针实现研究(一)

最近在《C++对象模型》一书里说到virtual成员函数指针,低于128cfront编译器认为是虚表偏移量(支持子类对父类函数覆盖)。...图片 图二:VC成员函数调用 调用时候倒是比较简单,各种实现都一样。都是把类实例地址给了cx寄存器,然后直接调用调转。那么这里关键就在于vcall做了什么,怎么保证调用了正确函数。...图片 图五:GCC单继承下成员函数指针赋值操作 很明显就和VC不一样啦,GCC在给成员函数指针赋值时候,给了两个值,第二个暂时没用到后面讨论。...往下看函数调用: 图片 图六:GCC单继承下成员函数指针调用 可以看到,GCC成员函数指针和VC设计明显不同。...下一篇 VC和GCC成员函数指针实现研究(二)

48920

VC和GCC内成员函数指针实现研究(一)

最近在《C++对象模型》一书里说到virtual成员函数指针,低于128cfront编译器认为是虚表偏移量(支持子类对父类函数覆盖)。...那么这里关键就在于vcall做了什么,怎么保证调用了正确函数。 call指令里只有一行jmp跳转,我就不列举出了,接下来看vcall{8}干了什么。...image.png 图五:GCC单继承下成员函数指针赋值操作 很明显就和VC不一样啦,GCC在给成员函数指针赋值时候,给了两个值,第二个暂时没用到后面讨论。...往下看函数调用: image.png 图六:GCC单继承下成员函数指针调用 可以看到,GCC成员函数指针和VC设计明显不同。...下一篇 VC和GCC成员函数指针实现研究(二)

82430

c++系列之二 指向成员函数指针(烧脑)

C++类型转换规则 非虚函数情形 我们在前面一节看到,成员函数指针并不是常规指针,所以,成员函数指针(非静态)不能转换成常规指针(当然,如果哪个脑残真想这么做的话,可以使用汇编技术来暴力解决),因为成员函数指针代表了..., 成员函数能够具有多态性并且现在调用是 FooDerived::f() ,而且 Bar::b() 也能正确调用了。...,而成员函数指针数组用来根据菜单选项执行相应打印动作。 成员函数指针另外一个重要应用可以在STL mem_fun() 中找到。...(翻译君去看了一下 mem_fun() 源代码,原来是用成员函数来构造仿函数functor。) 成员函数调用和 this 指针 现在我们回到文章最开始地方。为什么一个空指针也能调用成员函数?...对于一个虚函数调用,我们需要虚函数表来查找正确函数,然后, this 指针传递给这个函数。 这就是非虚函数、虚函数、静态函数成员函数指针使用不用实现方式根本原因。

2.8K20

C++ this指针:用于在成员函数中指向调用该函数对象

C++中this指针是一个指向当前对象指针。在成员函数中,可以使用this指针访问调用该函数对象成员变量和成员函数。...一、定义和使用this指针 this指针是在成员函数内部定义一个常量指针。它存储了当前对象地址,可以通过它访问当前对象成员变量和成员函数。...,this指针用来访问成员变量name。...这里this->name等价于成员变量name。在getName函数内部,this指针用来访问成员函数getName()。这里this->getName()等价于调用成员函数getName()。...这里使用了*this来访问调用该函数对象。 三、作为函数参数this指针 this指针也可以作为函数参数传递。这种情况下,可以在函数内部访问其他对象成员变量和成员函数

18240

C++类this指针,静态成员,友元函数友元类

在 C++ 中,每一个对象都能通过 this 指针访问自己地址,this 指针是所有成员函数隐含参数,实际上成员函数默认第一个参数为T* const register this,this指针成员函数开始执行前构造...,它可以用来指向调用对象,并且只可以在成员函数中调用,对于全局函数,静态函数,友元函数,都不能使用this指针。...也就是说在函数体内,静态变量具有“记忆”功能,即一个声明为静态变量在这一函数调用过程中其值维持不变,每个对象有各自成员变量,但是他们共享静态变量。所以静态变量相当于是大家共有资源。...所以this指针不能在静态函数中使用,静态函数如同静态变量一样,他不属于具体哪一个对象,静态函数表示了整个类范围意义上信息,而this指针却实实在在对应一个对象,所以this指针不能静态函数使用...因为是需要友元来共享数据,那么大多数情况,友元函数都是有参数, 因为友元函数没有this指针,则参数要有三种情况: 要访问非static成员时,需要对象做参数; 要访问static成员或全局变量时

1.4K10

【Android 逆向】ART 函数抽取加壳 ⑥ ( 函数抽取后续操作 “ 还原抽取函数 “ | LoadClass 类加载 | LoadClassMembers 类成员加载 )

文章目录 一、函数抽取后续操作 " 还原抽取函数 " 二、class_linker.cc#LoadClass 类加载操作 三、class_linker.cc#LoadClassMembers 类成员加载操作...函数 ) 博客实现 自定义 myexecve 函数 替换 libc.so#execve 函数 ; 本篇博客开始分析 函数收取后续操作 , 查找还原抽取函数时机 ; 一、函数抽取后续操作 " 还原抽取函数...应用中 Dex 字节码文件中函数抽取出来 , 执行前必须将函数还原 , 第一步 关闭 dex2oat 机制 , 第二步 还原抽取函数 ; 二、class_linker.cc#LoadClass...---- 在 " art/runtime/class_linker.cc#LoadClass " 函数 中调用 LoadClassMembers 函数 , 该函数作用是加载 类成员 , 包括 成员字段...和 成员变量 ; 在 LoadClassMembers 函数中 , 首先加载了静态字段 , 然后加载实例字段 , 最后加载 成员函数 ; 在加载函数过程中 , 调用了 LoadMethod 方法 ,

31720

C++核心准则C.4:只有直接访问表达函数,才应该成为成员

和使用成员函数相比普通函数耦合性略低,一方面可以通过修改对象状态带来麻烦函数会变少,另一方面可以减少改变类表达时需要修改函数数量。...“帮助函数”没有需求要直接访问Data表达。...(C++)语言要求虚函数必须是成员,而且不是所有的虚函数都会直接访问数据。通常抽象类成员很少直接访问数据。 Note multi-methods....寻找没有直接接触数据成员非虚成员函数。讽刺是存在许多不需要直 接访问数据成员成员函数。 Ignore virtual functions. 忽略虚函数。...如果一组重载函数中至少有一个函数访问了私有成员,那么忽略其他函数。 Ignore functions returning this. 忽略返回this指针函数

33020

C++核心准则C.33:如果类包含拥有所有权指针成员,定义析构函数

C.33: If a class has an owning pointer member, define a destructor C.33:如果类包含拥有所有权指针成员,定义析构函数 Reason...指针成员可能用于表达某个资源。T*不应该这么做,但是在旧一些代码中,这种做法很常见。考虑到T*作为所有者使用可能性,并确认。...一般来说,得到析构函数最简单方式是将指针换成智能指针(例如std::unique_ptr)并且让编译器提供适当隐式执行析构动作。...为什么不简单地要求所有的所有者指针都变成“智能指针”?因为那样做有时会引起重大代码变更并且影响二进制接口。...带有指针类型数据成员类都是可疑。 A class with an owner should define its default operations.

57820

【C++】继承 ④ ( 继承对访问控制权限影响 | 访问权限判定 | 继承不包括构造与析构函数 | 继承改变成员访问权限 )

一、继承相关概念 1、继承不包括构造与析构函数 子类 继承 父类 所有成员 , 包括 成员变量 和 成员方法 ; 子类 不会 继承 父类 构造函数 和 析构函数 ; 2、继承改变成员访问权限 父类...1、访问权限 访问控制权限 : 公有成员 public : 公有成员可以任何对象访问 , 包括类外部和所有从该类派生子类 ; 完全开放 : 如果一个成员声明为公有 , 那么它可以在任何地方访问..., 就像公共场所一样 ; 保护成员 protected : 保护成员可以该类和所有派生子类访问 , 但不能外部访问 ; 半开放 : 只有 在类内部 和 派生类 成员可以访问它 ; 私有成员...private : 私有成员 只能该类成员函数访问 , 包括友元函数和派生类中覆盖函数 ; 完全封闭 : 在 类外部 和 子类 中都不能访问私有成员 ; private 是最安全访问控制级别...int private_member; public: // 针对共有成员变量访问函数可以不写 void set_public_member(int value) {

18710

C++面试知识总结

2.23 有一个char * 型指针刚好指向一些int 型变量, 我想跳过它们。 为什么((int *)p)++; 不行? 类型转换实质“把这些二进制位看作另一种类型, 并作相应对待”。...,派生类成员函数可以访问基类中公有和受保护成员;公有继承时基类受保护成员,可以通过派生类对象访问不能修改。...私有继承时,基类成员只能直接派生类成员访问,无法再往下继承。 受保护继承时,基类成员也只直接派生类成员访问,无法再往下继承。...因为static成员不是任何对象组成部分,所以static成员函数不能声明为const。 static成员函数不能声明为虚函数。...在模块内static全局变量可以模块内所用函数访问,但不能模块外其它函数访问。 在模块内static函数只可被这一模块内其它函数调用,这个函数使用范围限制在声明它模块内。

1.7K41

C++:43---派生类向基类转换、静态动态类变量

此时基类可以通过指针或引用指向派生类(相当于将派生类从基类中继承那部分方法和成员绑定到基类上了,相当于派生类截断了),然后基类就可以将派生类假装是一个基类对象来使用(调用其中成员/方法) ②为什么基类不能转换为派生类...如果将一个基类对象绑定到派生类指针/引用上,此时派生类通过指针/引用访问自己新定义成员/方法时,发现找不到(因此不能将基类转换为派生类) 例如:下面B继承于A,子类继承于父类,同时为父类成员开辟了空间...class A{}; class B :protected A { void func() { A *a; B b; a = &b; //正确成员函数内可以 a = this; //正确成员函数内可以...,那么调用时候也取决于左边类型 转换之后,基类只能通过派生类访问属于自己(基类)那一部分,而不能访问属于派生类数据成员(见下面演示案例③) 虚函数调用是个例外:虚函数调用是取决于指针或引用所指向类型...函数 打印“B:show2”:因为show2()函数为虚函数,所以根据虚函数性质,使用基类指针访问子类时,访问函数指针所指类对象类型有关,此处指针所指类类型为B,因此访问Bshow2()函数

1.6K10
领券