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



         

Наилучшая из устоявших функций


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

  • преобразование аргумента типа производного класса в параметр типа любого из его базовых;
  • преобразование указателя на тип производного класса в указатель на тип любого из его базовых;
  • инициализация ссылки на тип базового класса с помощью l-значения типа производного.
  • Они не являются пользовательскими, так как не зависят от конвертеров и конструкторов, имеющихся в классе:

    extern void release( const ZooAnimal& );

    Panda yinYang;

    // стандартное преобразование: Panda -> ZooAnimal

    release( yinYang );

    Поскольку аргумент yinYang типа Panda инициализирует ссылку на тип базового класса, то преобразование имеет ранг стандартного.

    В разделе 15.10 мы говорили, что стандартные преобразования имеют более высокий ранг, чем пользовательские:

    class Panda : public Bear,

                  public Endangered

    {

       // наследует ZooAnimal::operator const char *()

    };

    Panda yinYang;

    extern void release( const ZooAnimal& );

    extern void release( const char * );

    // стандартное преобразование: Panda -> ZooAnimal

    // выбирается: release( const ZooAnimal& )

    release( yinYang );

    Как release(const char*), так и release(ZooAnimal&) являются устоявшими функциями: первая потому, что инициализация параметра-ссылки значением аргумента – стандартное преобразование, а вторая потому, что аргумент можно привести к типу const char* с помощью конвертера ZooAnimal::operator const char*(), который представляет собой пользовательское преобразование. Так как стандартное преобразование лучше пользовательского, то в качестве наилучшей из устоявших выбирается функция release(const ZooAnimal&).




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