Функции-кандидаты - часть 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().