|
|
Используя уточненное имя, можно установить доступ к члену базового
класса в части public или protected описания производного класса.
Это называется описанием доступа.
Приведем пример:
class B { int a; public: int b, c; int bf(); }; class D : private B { int d; public: B::c; // adjust access to `B::c' int e; int df(); }; int ef(D&);
Во внешней функции ef можно использовать только имена c, e, и df.
Поскольку функция df член класса D, в ней можно использовать
имена b, c, bf, d, e и df, но не a. Функция bf - член класса B и
в ней можно использовать члены a, b, c и bf.
Описания доступа не следует использовать для ограничения доступа
к члену, доступному в базовом классе, также как не следует
использовать его для обеспечения доступа к члену, который недоступен
в базовом классе, например:
class B { public: int a; private: int b; protected: int c; }; class D : private B { public: B::a; // описать `a' как общий член D B::b; // ошибка: попытка расширить доступ, // `b' не может быть общим членом D protected: B::c; // описать `c' как защищенный член D B::a; // ошибка: попытка сузить доступ, // `a' не может быть защищенным членом D };
Описание доступа для имени перегруженной функции устанавливает доступ в базовом классе ко всем функциям с этим именем, например:
class X { public: f(); f(int); }; class Y : private X { public: X::f; // makes X::f() and X::f(int) public in Y };
Нельзя в производном классе установить доступ к члену базового класса, если в производном классе определен член с этим же именем, например:
class X { public: void f(); }; class Y : private X { public: void f(int); X::f; // ошибка: два описания f };
| |