注意:启用此功能的直接(且推荐)方法是将继承类设为基类的friend(友元)
类;这意味着它将可以访问其protected(受保护的)
和private(私有的)
部分。
我想打破规则
所以你决定标准制定的规则很烦人,你想在任何想要的时间,以任何你想要的方式做任何你想做的事情!规则是用来打破的,等等。
class B {
protected:
void f ();
};
class D : public B {
public:
void g (B * other) {
(other->*&D::f) (); // legal
}
};
D
中检查B::f
,但我们当然可以查看D::f
;因为它与继承的同名函数相同,而我们没有在D
中声明另一个f
。D::f
的地址,因为它实际上是指向B
的成员函数指针,我们使用该地址调用other
上的函数。void (B::*hack)() = &D::f; (other->*hack) ();
注意:从技术上讲,我们并没有深入访问B
的保护内容,我们只是依赖于通过D::f
访问的内容恰好与B::f
中的内容相同这一事实。我们仍然遵循标准规定的规则,只是有些滥用了它们。
friend
解决方案不同。 - Félix Faisantclass D
声明为 class B
的 friend
:class B {
friend class D;
protected:
void f ();
};