В некоторых случаях, которые представляются неоднозначными, неоднозначности фактически нет. Рассмотрим следующую простую иерархию (листинг 10.4).
Листинг 10.4. Демонстрация принципа доминирования
class Up { public: virtual ~Up() {};
virtual void PtintO { cout << "Up!" << endl; }
};
class Left: virtual public Up
{ public: // метод Print переопределен
virtual void PtintO { cout << "Left!" << endl; }
};
class Right: virtual public Up { // метод Print унаследован
};
class Down: public Left, public Right { };
Класс Down унаследовал метод PrintO непосредственно от класса Left, а также метод PrintO от класса Up «транзитом» через класс Right. Вроде бы налицо неоднозначность в ситуации:
Down а; a.PrintO ;
Однако в С++ определено правило доминирования (см. п. п. 10.2/6 в [1]), согласно которому в данной ситуации будет вызываться функция из класса Left. В ситуациях, подобных данной, компилятор выбирает «наиболее производное» имя, которое считает доминирующим. Работает это правило только при виртуальном наследовании. |