С++ для начинающих



         

Область видимости класса и наследование


У каждого класса есть собственная область видимости, в которой определены имена членов и вложенные типы (см. разделы 13.9 и 13.10). При наследовании область видимости производного класса вкладывается в область видимости непосредственного базового. Если имя не удается разрешить в области видимости производного класса, то поиск определения продолжается в области видимости базового.

Именно эта иерархическая вложенность областей видимости классов при наследовании и делает возможным обращение к именам членов базового класса так, как если бы они были членами производного. Рассмотрим сначала несколько примеров одиночного наследования, а затем перейдем к множественному. Предположим, есть упрощенное определение класса ZooAnimal:

class ZooAnimal {

public:

   ostream &print( ostream& ) const;

   // сделаны открытыми только ради демонстрации разных случаев

   string is_a;

   int    ival;

private:

   double dval;

};

и упрощенное определение производного класса Bear:

class Bear : public ZooAnimal {

public:

   ostream &print( ostream& ) const;

   // сделаны открытыми только ради демонстрации разных случаев

   string name;

   int    ival;

};

Когда мы пишем:

Bear bear;

bear.is_a;

то имя разрешается следующим образом:

  • bear – это объект класса Bear. Сначала поиск имени is_a ведется в области видимости Bear. Там его нет.
  • Поскольку класс Bear производный от ZooAnimal, то далее поиск is_a ведется в области видимости последнего. Обнаруживается, что имя принадлежит его члену. Разрешение закончилось успешно.
  • Хотя к членам базового класса можно обращаться напрямую, как к членам производного, они сохраняют свою принадлежность к базовому классу. Как правило, не имеет значения, в каком именно классе определено имя. Но это становится важным, если в базовом и производном классах есть одноименные члены. Например, когда мы пишем:

    bear.ival;

    ival – это член класса Bear, найденный на первом шаге описанного выше процесса разрешения имени.

    Иными словами, член производного класса, имеющий то же имя, что и член базового, маскирует последний. Чтобы обратиться к члену базового класса, необходимо квалифицировать его имя с помощью оператора разрешения области видимости:




    Содержание  Назад  Вперед