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



         

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


mumble( static_cast< Bear >( yinYang ) );  // правильно

Инициализация объекта производного класса или ссылки на него объектом типа базового, а также преобразование указателя на тип базового класса в указатель на тип производного никогда не выполняются компилятором неявно. (Однако их можно выполнить с помощью явного применения dynamic_cast, как мы видели в разделе 19.1.) Для данного вызова не существует наилучшей из устоявших функции, так как нет неявного преобразования аргумента типа ZooAnimal в тип производного класса:

extern void release( const Bear& );

extern void release( const Panda& );

ZooAnimal za;

// ошибка: нет соответствия

release( za );

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

Class ZooAnimal {

public:

   // преобразование: ZooAnimal ==> const char*

   operator const char*();

   // ...

};

extern void release( const char* );

extern void release( const Bear& );

ZooAnimal za;

// za ==> const char*

// правильно: release( const char* )

release( za );Ошибка! Закладка не определена.Ошибка! Закладка не определена.Ошибка! Закладка не определена.

Упражнение 19.9

Дана такая иерархия классов:

class Base1 {

public:

   ostream& print();

   void debug();

   void writeOn();

   void log( string );

   void reset( void *);

   // ...

};

class Base2 {

public:

   void debug();

   void readOn();

   void log( double );

   // ...

};

class MI : public Base1, public Base2 {

public:

   ostream& print();

   using Base1::reset;

   void reset( char * );

   using Base2::log;




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