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



         

Область видимости класса при множественном наследовании - часть 2


int main()

{

   Panda yin_yang;

   yin_yang.dance( Bear::macarena );

}

ближайшей будет область видимости класса Panda, к которому принадлежит yin_yang. Если же мы напишем:

void Panda::mumble()

{

   dance( Bear::macarena );

   // ...

}

то ближайшей будет локальная область видимости функции-члена mumble(). Если объявление dance в ней имеется, то разрешение имени на этом благополучно завершится. В противном случае поиск будет продолжен в объемлющих областях видимости.

В случае множественного наследования имитируется одновременный просмотр всех поддеревьев наследования – в нашем случае это класс Endangered и поддерево Bear/ZooAnimal. Если объявление обнаружено только в поддереве одного из базовых классов, то разрешение имени заканчивается успешно, как, например, при таком вызове dance():

// правильно: Bear::dance()

yin_yang.dance( Bear::macarena );

Если же объявление найдено в двух или более поддеревьях, то обращение считается неоднозначным и компилятор выдает сообщение об ошибке. Так будет при неквалифицированном обращении к print():

int main()

{

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

   //         Bear::print( ostream& ) const

   //         Endangered::print( ostream& ) const

   Panda yin_yang;

   yin_yang.print( cout );

}

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

int main()

{

   // правильно, но не лучшее решение

   Panda yin_yang;

   yin_yang.Bear::print( cout );

}

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

inline void Panda::highlight() {




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