Предположим, у нас есть два класса:
class Base
{
private:
int x;
public:
void f();
};
class Foo
{
// some variables and methods
};
Теперь каждый может вызывать Base::f()
, но я хочу, чтобы это мог сделать только Foo
.
Чтобы добиться такого эффекта, мы можем сделать Base::f()
закрытым и объявить Foo
другом:
class Base
{
private:
int x;
void f();
friend Foo;
};
Проблема с этим подходом заключается в том, что Foo
имеет доступ как к Base::f()
, так и к Base::x
(и даже к любым другим закрытым членам Base
). Но я хочу, чтобы Foo
имел доступ только к Base::f()
.
Есть ли способ для класса (или функции) предоставлять доступ только определенным закрытым членам другого класса? Или, может быть, кто-нибудь может предложить лучший подход к моей проблеме?
РЕДАКТИРОВАТЬ:
Я попытаюсь указать ограничение доступа, которое мне нужно. Во-первых, Base
— это интерфейс в библиотеке (фактически это абстрактный класс). Пользователь использует только классы, производные от Base
. Base::f()
вызывается только Foo
, который является другим классом в библиотеке. Сокрытие Base::f()
от пользователя важно, потому что только Foo
знает, когда его вызывать. В то же время Foo
не должен мешать другим членам Base
.