Страница:
227 из 357
Возможность, позволяющая программисту получать доступ к закрытой части класса просто с помощью вывода из него другого класса, лишила бы понятие зарытого члена всякого смысла. Более того, нельзя было бы унать все использования закрытого имени, посмотрев на функции, описанные как члены и друзья этого класса. Пришлось бы проврять каждый исходный файл во всей программе на наличие в нем производных классов, потом исследовать каждую функцию этих классов, потом искать все классы, производные от этих класов, и т.д. Это по меньшей мере утомительно и скорее всего нереально.
С другой стороны, можно ведь использовать механизм friend, чтобы предоставить такой доступ или отдельным функцям, или всем функциям отдельного класса (как описывается в #5.3). Например:
class employee (* friend void manager::print(); // ... *);
решило бы проблему с manager::print(), и
class employee (* friend class manager; // ... *);
сделало бы доступным каждый член employee для всех фунций класса manager. В частности, это сделает name доступным для manager::print().
Другое, иногда более прозрачное решение для производного класса – использовать только открытые члены его базового класса. Например:
void manager::print() (* employee::print(); // печатает информацию о служащем // ... // печатает информацию о менеджере *)
Заметьте, что надо использовать ::, потому что print() была переопределена в manager. Такое повторное использование имен типично. Неосторожный мог бы написать так:
void manager::print() (* print(); // печатает информацию о служащем // ...
|< Пред. 225 226 227 228 229 След. >|