►Устранение неоднозначностей множественного наследования...300

We use cookies. Read the Privacy and Cookie Policy

Будучи весьма мощной возможностью языка, множественное наследование может стать в то же время и источником проблем. Одну из них можно увидеть уже в предыдущем примере. Обратите внимание, что оба класса — Bed и Sofa — содержат член weight ( вес ). Это логично, потому что они оба имеют некоторый вполне измеримый вес. Вопрос: какой именно член weight наследует класс SleeperSofa?

Ответ прост: оба. Класс SleeperSofa наследует отдельный член Bed::weight и отдельный член Sofa::weight. Поскольку они оба имеют одно и то же имя, обращения к weight теперь являются двузначными, если только не указывать явно, к какому именно weight мы намерены обратиться. Это демонстрирует следующий фрагмент кода:

    #include <iostream>

    void fn( )

    {

        SleeperSofa ss ;

        cout << "Beс = "

             << ss.weight /* неправильно — какой именно вес? */

             << " " ;

    }

Теперь в программе нужно явно указывать, какая именно переменная weight нужна, используя для этого имя базового класса. Приведённый ниже пример вполне корректен.

    #include <iostream>

    void fn( )

    {

        SleeperSofa ss ;

        cout << "Вес дивана = "

             << ss.Sofa::weight /*укажем, какой именно вес */     

              << " " ;

    }

Хотя такое решение и устраняет ошибку, указание имени базового класса во внешнем приложении нежелательно: ведь при этом информация о внутреннем устройстве класса должна присутствовать за его пределами. В нашем примере функция fn( ) должна располагать сведениями о том, что класс SleeperSofa наследуется от класса Sofa. Такие конфликты имён невозможны при одиночном наследовании, но служат постоянным источником неприятностей при наследовании множественном. 

_________________

300 стр. Часть 5. Полезные особенности