下面就給人「保護」之類訪問,允許通過任何派生類或對象調用的方法。 它使用一個受保護的令牌類型,需要取消鎖定特權方法:
struct A
{
protected:
//Zero sized struct which allows only derived classes to call privileged methods
struct DerivedOnlyAccessToken{};
public: //public in the normal sense :
void foo() {}
public: //For derived types only :
void privilegedStuff(DerivedOnlyAccessToken aKey);
};
struct B: A
{
void doPrivelegedStuff(A& a)
{
//Can create a token here
a.privilegedStuff(DerivedOnlyAccessToken());
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.foo();
a.privilegedStuff(A::DerivedOnlyAccessToken()); // compile error.
B b;
b.doPrivelegedStuff(a);
return 0;
}
這不是我的主意。我讀了一些地方。對不起,我不記得那是誰的狡猾想法。
我希望編譯器可以忽略aKey參數。
爲什麼'B :: bar'需要調用'A :: foo'?如果'A :: foo'受到保護,這應該意味着只有'A'類型的對象和從'A'派生的任何類型才能夠調用它。如果你確實需要從一個不相關的類調用'A :: foo',可能它不應該被保護。 – 2010-12-19 20:57:26
什麼是問題? – 2010-12-19 20:57:56
當'B'是'A'類型時,將'A'實例傳遞給'B'的原因是什麼? – birryree 2010-12-19 20:58:11