Статья: Производные Классы

Это многим покажется удивительным, но представьте себе другой вариант: что функция член могла бы обращаться к закрытым членам своего базового класса. Возможность, позволяющая программисту получать доступ к закрытой части класса просто с помощью вывода из него другого класса, лишила бы понятие закрытого члена всякого смысла. Более того, нельзя было бы узнать все использования закрытого имени посмотрев на функции, описанные как члены и друзья этого класса. Пришлось бы проверять каждый исходный файл во всей программе на наличие в нем производных классов, потом исследовать каждую функцию этих классов, потом искать все классы, производные от этих классов, и т.д. Это по меньшей мере утомительно и скорее всего нереально.

С другой стороны, можно ведь использовать механизм friend, чтобы предоставить такой доступ или отдельным функциям, или всем функциям отдельного класса .

Например:

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(); // печатает информацию о служащем

// ... // печатает информацию о менеджере

}

и обнаружить, что программа после вызова manager::print() неожиданно попадает в последовательность рекурсивных вызовов.

Видимость

Класс employee стал открытым (public) базовым классом класса manager в результате описания:

К-во Просмотров: 583
Бесплатно скачать Статья: Производные Классы