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


Функции-кандидаты - часть 3


типа Bear, то при поиске кандидатов для этого вызова просматривается только область видимости класса Bear, и единственным кандидатом будет feeding_time(int). Так как других кандидатов нет, вызов считается ошибочным.

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

class Bear : public ZooAnimal {

public:

   // feeding_time( int ) перегружает экземпляр из класса ZooAnimal

   using ZooAnimal::feeding_time;

   Time feeding_time( int );

   // ...

};

Теперь обе функции feeding_time()

находятся в области видимости класса Bear и, следовательно, войдут в множество кандидатов:

// правильно: вызывается ZooAnimal::feeding_time( string )

Winnie.feeding_time( "Winnie" );

В такой ситуации вызывается функция-член feeding_time( string ).

В случае множественного наследования при формировании совокупности кандидатов объявления функций-членов должны быть найдены в одном и том же базовом классе, иначе вызов считается ошибочным. Например:

class Endangered {

public:

   ostream& print( ostream& );

   // ...

{;

 

class Bear : public( ZooAnimal ) {

public:

   void print( );

   using ZooAnimal::feeding_time;

   Time feeding_time( int );

   // ...

};

 

class Panda : public Bear, public Endangered {

public:

   // ...

};

 

int main()

{

   Panda yin_yang;

 

   // ошибка: неоднозначность: одна из

   //         Bear::print()

   //         Endangered::print( ostream& )

   yin_yang.print( cout );

 

   // правильно: вызывается Bear::feeding_time()

   yin_yang.feeding_time( 56 );

}

При поиске объявления функции-члена print() в области видимости класса Panda

будут найдены как Bear::print(), так и Endangered::print(). Поскольку они не находятся в одном и том же базовом классе, то даже при разных списках параметров этих функций множество кандидатов оказывается пустым и вызов считается ошибочным. Для исправления ошибки в классе Panda

следует определить собственную функцию print(). При поиске объявления функции-члена feeding_time() в области видимости Panda

будут найдены ZooAnimal::feeding_time() и Bear::feeding_time() – они расположены в области видимости класса Bear. Так как эти объявления найдены в одном и том же базовом классе, множество кандидатов для данного вызова включает обе функции, а выбирается Bear::feeding_time().




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



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