Вот подход к предоставлению «защищенного» аналогичного доступа, позволяющего вызывать любые производные классы или объекты.Он использует защищенный тип токена, необходимый для разблокировки привилегированных методов:
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.