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;