关于成员函数指针的权限

时间:2013-07-21 05:16:00

标签: c++

您好我对c ++成员函数的权限有疑问。

示例1

class Test {
    private:
    void func() { cout << "test" << endl; }
};

void weird_func(Test* t, void (Test::*f)()) {
    (t->*f)();
}

int main() {
    Test t;
    weird_func(&t, &Test::func);
}

这不起作用

test1.cc: In function ‘int main()’:
test1.cc:10:10: error: ‘void Test::func()’ is private
test1.cc:19:26: error: within this context

然而,另一个例子有效

class Test {
    public:
    void helper(Test* ptr);
    private:
    void func() { cout << "test" << endl; }
};

void weird_func(Test* t, void (Test::*f)()) {
    (t->*f)();
}

void Test::helper(Test* ptr) {
    weird_func(ptr, &Test::func);
}

int main() {
    Test t;
    t.helper(&t);
}

我不太明白为什么第二个例子会起作用。唯一的区别是它有一个辅助函数。对于两个示例,在weird_func中调用Test :: func,这不是Test类的成员。我想有一些关于使用成员函数指针存储的权限的信息。有人会确认(或否认)这个并解释一下引擎盖下的原因吗?

谢谢, 二

1 个答案:

答案 0 :(得分:3)

:: helper可以访问私有函数,因此可以解决它,或者在这种情况下将地址传递给另一个函数。一旦将它作为函数指针引用,就可以像使用指向类属性的指针一样传递它。这在坏人手中是危险的:)。