Язык программирования C++. Вводный курс


Доступ к членам базового класса - часть 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();

 

   // ...

<


Начало  Назад  Вперед



Книжный магазин