Программирование >>  Инициализация объектов класса, структура 

1 ... 285 286 287 [ 288 ] 289 290 291 ... 395


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;

независимого объекта базового класса:



1 ... 285 286 287 [ 288 ] 289 290 291 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика