Преобразование от указателя к указателю между полученными и базовыми классами?

Относительно следующей программы 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**’

Мой вопрос находится в двух частях:

  1. Почему не там никакое неявное преобразование от Ребенка ** для Базирования **?
  2. Я могу заставить этот пример работать с броском C-стиля или a reinterpret_cast. Используя эти броски означает выбрасывать всю безопасность типов. Есть ли что-либо, что я могу добавить к определениям классов, чтобы сделать эти указатели броском неявно или по крайней мере формулировать преобразование способом, которое позволяет мне использовать static_cast вместо этого?
12
задан curiousguy 24 July 2012 в 18:41
поделиться

1 ответ

Если бы это было разрешено, вы могли бы написать следующее:

*bb = new Base;

И c в конечном итоге будет указывать на экземпляр Base . Плохой.

21
ответ дан 2 December 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: