public: void f() {} }: class

Автор admin Вторник, 16 июня 2009 11:32

public: void f() {} }: class Bottom : public Left, public Right { public: using Left::f; }: int mainO { Bottom b: b.fO: // Вызов Left: :f() } ///:- Имя Left::f теперь находится в области видимости Bottom, поэтому имя Right::f вообще не рассматривается. Если потребуется ввести дополнительные возможности, выходящие за пределы Left::f(), вы реализуете функцию Bottom::f(), которая вызывает Left::f(). Между одноименными функциями в разных ветвях иерархии часто возникают конфликты. В следующей иерархии такой проблемы нет: //: С09:Dominance.срр class Тор { public: virtual -TopO {} virtual void f() {} }: class Left : virtual public Top { public: void f(){} }: class Right : virtual public Top {}: class Bottom : public Left, public Right {}: int mainO { Bottom b; b.fO: // Вызывает Left: :f() } III:- В этой иерархии функции Right::f() нет. Для выражения b.f() будет выбрана функция Left::f(). Почему? Давайте представим, что класс Right не существует, то есть мы имеем дело с одиночным наследованием Тор <= Left <= Bottom. Конечно, в соответствии со стандартными правилами области видимости для выраже- 464 Глав


Комментарии закрыты.