Что касается следующей программы на 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
?
Вариации по этому вопросу на многих языках программирования являются одним из наиболее распространенных вопросов о SO. Но все фразы это немного по-разному даже для одного и того же языка, поэтому найти дубликаты могут быть трудными. –
«Исправление» этого примера, чтобы избежать теневых бросков, будет зависеть от того, почему вы используете указатель на указатель в первую очередь. – aschepler