Язык программирования C++ для профессионалов


Разрешение неоднозначности - часть 2


void manager::print() { employee::print(); // ... }

предполагается, что employee - прямой базовый класс для manager. Результат этой функции не изменится, если employee окажется косвенным базовым классом для manager, а в прямом базовом классе функции print() нет. Однако, кто-то мог бы следующим образом перестроить классы:

class employee { // ... virtual void print(); };

class foreman : public employee { // ... void print(); };

class manager : public foreman { // ... void print(); };

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

class foreman : public employee { typedef employee inherited; // ... void print(); };

class manager : public foreman { typedef foreman inherited; // ... void print(); };

void manager::print() { inherited::print(); // ... }

Правила областей видимости, в частности те, которые относятся к вложенным типам, гарантируют, что возникшие несколько типов inherited не будут конфликтовать друг с другом. В общем-то дело вкуса, считать решение с типом inherited наглядным или нет.




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



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