Доступ к членам базового класса - часть 2
класса Shy
(объекта string), даже если такое использование в данном контексте недопустимо:
void Shy:: turn_eyes_down() { // ... _mumble = "excuse me"; // правильно
// ошибка: int Diffident::_mumble скрыто _mumble = -1; |
}
Некоторые компиляторы помечают это как ошибку типизации. Для доступа к члену базового класса, имя которого скрыто в производном, необходимо квалифицировать имя члена базового класса именем самого этого класса с помощью оператора разрешения области видимости. Так выглядит правильная реализация функции-члена turn_eyes_down():
void Shy:: turn_eyes_down() { // ... _mumble = "excuse me"; // правильно
// правильно: имя члена базового класса квалифицировано Diffident::_mumble = -1; |
}
Функции-члены базового и производного классов не составляют множество перегруженных функций:
class Diffident { public: void mumble( int softness ); // ... };
class Shy : public Diffident { public: // скрывает видимость функции-члена Diffident::_mumble, // а не перегружает ее void mumble( string whatYaSay ); void print( int soft, string words ); // ... |
};
Вызов функции-члена базового класса из производного в этом случае приводит к ошибке компиляции:
Shy simon;
// правильно: Shy::mumble( string ) simon.mumble( "pardon me" );
// ошибка: ожидался первый аргумент типа string // Diffident::mumble( int ) невидима |
simon.mumble( 2 );
Хотя к членам базового класса можно обращаться напрямую, они сохраняют область видимости класса, в котором определены. А чтобы функции перегружали друг друга, они должны находиться в одной и той же области видимости. Если бы это было не так, следующие два экземпляра невиртуальной функции-члена turn_aside()
class Diffident { public: void turn_aside( ); // ... };
class Shy : public Diffident { public: // скрывает видимость // Diffident::turn_aside() void turn_aside();
// ... |