Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет117/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   113   114   115   116   117   118   119   120   ...   256
6.2.1 Функции-члены 
Простые структуры данных вроде employee и manager сами по себе не слишком интересны, а часто и не 
особенно полезны. Поэтому добавим к ним функции: 
class employee { 
char* 
name; 
// 
... 
public: 
employee* 
next; 
// находится в общей части, чтобы 
// можно было работать со списком 
void 
print() 
const; 
// 
... 
}; 
class manager : public employee { 
// 
... 
public: 
void 
print() 
const; 
// 
... 
}; 
Надо ответить на некоторые вопросы. Каким образом функция-член производного класса manager 
может использовать члены базового класса employee? Какие члены базового класса employee могут 
использовать функции-члены производного класса manager? Какие члены базового класса employee 
может использовать функция, не являющаяся членом объекта типа manager? Какие ответы на эти 
вопросы должна давать реализация языка, чтобы они максимально соответствовали задаче 
программиста? 
Рассмотрим пример: 
void manager::print() const 

cout << " 
имя " << name << '\n'; 

Член производного класса может использовать имя из общей части своего базового класса наравне со 
всеми другими членами, т.е. без указания имени объекта. Предполагается, что есть объект, на который 
настроен this, поэтому корректным обращением к name будет this->name. Однако, при трансляции 


Бьерн Страуструп.
Язык программирования С++ 
 
152 
функции manager::print() будет зафиксирована ошибка: члену производного класса не предоставлено 
право доступа к частным членам его базового класса, значит name недоступно в этой функции. 
Возможно многим это покажется странным, но давайте рассмотрим альтернативное решение: функция-
член производного класса имеет доступ к частным членам своего базового класса. Тогда само понятие 
частного (закрытого) члена теряет всякий смысл, поскольку для доступа к нему достаточно просто 
определить производный класс. Теперь уже будет недостаточно для выяснения, кто использует 
частные члены класса, просмотреть все функции-члены и друзей этого класса. Придется просмотреть 
все исходные файлы программы, найти производные классы, затем исследовать каждую функцию этих 
классов. Далее надо снова искать производные классы от уже найденных и т.д. Это, по крайней мере, 
утомительно, а скорее всего нереально. Нужно всюду, где это возможно, использовать вместо частных 
членов защищенные (см. $$6.6.1). 
Как правило, самое надежное решение для производного класса - использовать только общие члены 
своего базового класса: 
void manager::print() const 

employee::print(); // печать данных о служащих 
// печать данных об управляющих 

Отметим, что операция :: необходима, поскольку функция print() переопределена в классе manager. 
Такое повторное использование имен типично для С++. Неосторожный программист написал бы: 
void manager::print() const 

print();
// печать данных о служащих 
// печать данных об управляющих 

В результате он получил бы рекурсивную последовательность вызовов manager::print(). 


Достарыңызбен бөлісу:
1   ...   113   114   115   116   117   118   119   120   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет