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


Доступ к членам базового класса - часть 3


/p>

};

привели бы к ошибке повторного определения, так как их сигнатуры одинаковы. Однако запись правильна, поскольку каждая функция находится в области видимости того класса, в котором определена.

А если нам действительно нужен набор перегруженных функций-членов базового и производного классов? Написать в производном классе небольшую встроенную заглушку для вызова экземпляра из базового? Это возможно:

class Shy : public Diffident

{

public:

   // один из способов реализовать множество перегруженных

   // членов базового и производного классов

   void mumble( string whatYaSay );

   void mumble( int softness ) {

                Diffident::mumble( softness ); }

   // ...

};

Но в стандартном C++  тот же результат достигается посредством using-объявления:

class Shy : public Diffident

{

public:

   // в стандартном C++ using-объявление

   // создает множество перегруженных

   // членов базового и производного классов

   void mumble( string whatYaSay );

   using Diffident::mumble;

 

   // ...

};

По сути дела, using-объявление вводит каждый именованный член базового класса в область видимости производного. Поэтому такой член теперь входит в множество перегруженных функций, ассоциированных с именем функции-члена производного класса. (В ее using-объявлении нельзя указать список параметров, только имя. Это означает, что если некоторая функция уже перегружена в базовом классе, то в область видимости производного класса попадут все перегруженные экземпляры и, следовательно, добавить только одну из них невозможно.)

Обратим внимание на степень доступности защищенных членов базового класса. Когда мы пишем:

class Query {

public:

   const vector<location>* locations() { return &_loc; }

   // ...

protected:

   vector<location> _loc;

   // ...

};

то имеем в виду, что класс, производный от Query, может напрямую обратиться к члену _loc, тогда как во всей остальной программе для этого необходимо пользоваться открытой функцией доступа. Однако объект производного класса имеет доступ только к защищенному члену _loc входящего в него




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



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