Относительно следующей программы на 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**’
Мой вопрос состоит из двух частей:
- Почему нет неявного преобразования из Child ** в Base **?
- Я могу заставить этот пример работать с приведением в стиле C или
reinterpret_cast
. Использование этих слепков означает отказ от всех типов безопасности. Могу ли я что-нибудь добавить к определениям классов, чтобы эти указатели приводились неявно, или, по крайней мере, сформулировать преобразование так, чтобы вместо этого я мог использовать static_cast
?