Преобразование указатель-указатель между производными и базовыми классами?
Относительно следующей программы на C ++:
class Base { };
class Child : public Base { };
int main()
{
// Normal: using child as base is allowed
Child *c = new Child();
Base *b = c;
// Double pointers: apparently can't use Child** as Base**
Child **cc = &c;
Base **bb = cc;
return 0;
}
GCC выдает следующую ошибку в последнем операторе присваивания:
error: invalid conversion from ‘Child**’ to ‘Base**’
Мой вопрос состоит из двух частей:
Почему нет неявного преобразования из дочернего ** в базовый **?Я могу заставить этот пример работать с броском в стиле C илиreinterpret_cast
, Использование этих слепков означает отказ от всех типов безопасности. Могу ли я что-нибудь добавить к определениям классов, чтобы эти указатели приводились неявно, или, по крайней мере, сформулировать преобразование так, чтобы я могstatic_cast
вместо?