如何在类的公有成员函数内通过成员函数指针调用私有成员函数
实现方法
callError 是类 A 的成员函数,天然拥有类内私有成员的访问权限,你只需要在该函数内声明指向私有成员函数error的指针,绑定当前实例的this指针调用即可,示例实现如下:
void A::callError(void) { // 声明指向A类无参无返回值成员函数的指针,指向私有成员error void (A::*err_ptr)(void) = &A::error; // 绑定当前实例调用成员函数指针 (this->*err_ptr)(); }
补充说明
- 成员函数指针必须带上类名
A::*声明,取地址时必须写完整的&A::error,不可省略类名直接取地址 - 调用成员函数指针必须绑定具体的类实例,除了当前实例的
this指针,你也可以绑定其他同类型的类实例:void A::callError(void) { void (A::*err_ptr)(void) = &A::error; A another_obj; // 绑定其他同类型实例调用 (another_obj.*err_ptr)(); } - 该访问规则受C++权限控制约束,只有类成员函数、友元函数内部可以获取私有成员函数的指针,类外(比如
main函数)尝试获取&A::error会直接编译报错。
完整可运行示例
#include <iostream> class A { private: void error(void) { std::cout << "私有error函数被调用" << std::endl; } public: void callError(void); }; void A::callError(void) { void (A::*err_ptr)(void) = &A::error; (this->*err_ptr)(); } int main(void) { void (A::*abc)(void) = &A::callError; A test; (test.*abc)(); return 0; }
内容的提问来源于stack exchange,提问作者kuk
相关产品推荐
相关产品推荐

