|
Программирование >> Инициализация объектов класса, структура
void Shy:: turn eyes down() { ... mumle = excuse me ; правильно ошибка: int Diffident:: mumble скрыто mumble = -1; использование в данном контексте недопустимо: Некоторые компиляторы помечают это как ошибку типизации. Для доступа к члену базового класса, имя которого скрыто в производном, необходимо квалифицировать имя члена базового класса именем самого этого класса с помощью оператора разрешения области видимости. Так выглядит правильная реализация функции-члена void Shy:: turn eyes down() { ... mumle = excuse me ; правильно правильно: имя члена базового класса квафицировано Diffident:: mumble = -1; turn eyes down() : Функции-члены базового и производного классов не составляют множество class Diffident { public: void mumble( int softness ); ... class Shy : public public: Diffident { скрывает видимость функции-члена Diffident:: mumble, а не перегружает ее void mumble( string whatYaSay ); void print( int soft, string words ); ... перегруженных функций: }; Вызов функции-члена базового класса из производного в этом случае приводит к ошибке компиляции: В области видимости Shy употребление неквалифицированного имени miumble разрешается в пользу члена mumble класса Shy (объекта string), даже если такое Shy simon; авиль .mumble( pardon me ); правильно: Shy::mumble( string ) ошибка: ожидался перв аргумент типа string Diffident::mumble( int ) невидима simon.mumble( 2 ); Хотя к членам базового класса можно обращаться напрямую, они сохраняют область видимости класса, в котором определены. А чтобы функции перегружали друг друга, они должны находиться в одной и той же области видимости. Если бы это было не так, class Diffident { public: void turn aside( ); ... class Shy : public Diffident { public: скрывает видимость Diffident::turn aside() void turn aside(); ... следующие два экземпляра невиртуальной функции-члена turn aside() }; привели бы к ошибке повторного определения, так как их сигнатуры одинаковы. Однако запись правильна, поскольку каждая функция находится в области видимости того класса, в котором определена. А если нам действительно нужен набор перегруженных функций-членов базового и производного классов? Написать в производном классе небольшую встроенную заглушку class Shy : public public: Diffident { один из способов реализовать множество перегруженных членов базового и производного классов void mumble( string whatYaSay ); void mumble( int softness ) { Diffident::mumble( softness ); } ... для вызова экземпляра из базового? Это возможно: }; Но в стандартном C++ тот же результат достигается посредством using-объявления: class Shy : public Diffident { public: public: в стандартном C++ using-объявление лздает множество переГруженн создает множество членов базового и производного классов void mumble( string whatYaSay поптп Пп п PinV . .пЫ Р . using Diffident::mumble; ... По сути дела, using-объявление вводит кажд1й именованный член базового класса в область видимости производного. Поэтому такой член теперь входит в множество перегруженных функций, ассоциированных с именем функции-члена производного класса. (В ее using-объявлении нельзя указать список параметров, только имя. Это означает, что если некоторая функция уже перегружена в базовом классе, то в область видимости производного класса попадут все перегруженные экземпляры и, следовательно, добавить только одну из них невозможно.) Обратим внимание на степень доступности защищенных членов базового класса. Когда class Query { public: const vector<location>* locations() { return & loc; } ... protected: vector<location> loc; ... мы пишем: то имеем в виду, что класс, производный от Query, может напрямую обратиться к члену loc, тогда как во всей остальной программе для этого необходимо пользоваться открытой функцией доступа. Однако объект производного класса имеет доступ только к защищенному члену loc входящего в него нодобъекта, относящегося к базовому классу. Объект производного класса неспособен обратиться к защищенным членам другого bool NameQuery:: compare( const Query *pquery ) { правильно: защенн член подобъекта Query int matches = loc.size(); ошибка: нет прав доступа к защищенному члену независимого объекта Query int itsMatches = pery-> loc.size(); return matches == itsMatches; независимого объекта базового класса:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |