Рассмотрим этот простой пример:
struct Base1 {};
struct Base2 {};
struct Derived : public Base1, public Base2 {};
int main()
{
Derived foo;
Base1* foo1 = &foo;
Base2* foo2 = static_cast<Base2*>(foo1);
}
Я получаю:
Error: static_cast from 'Base1 *' to 'Base2 *', which are not related by inheritance, is not allowed
Компилятор должен иметь достаточно информации, чтобы выяснить, что Base2
может быть достигнуто с Derived
без RTTI (dynamic_cast
) и заставляет меня делать:
Derived* foo3 = static_cast<Derived*>(foo1);
Base2* foo2 = foo3;
Почему это не разрешено? (Можно утверждать, что компилятор не знает, имеет ли foo1
тип Derived
, но static_cast
не проверяет тип в любом случае, даже при преобразовании, например, из Base1
в Derived
)
Примечание: этот вопрос похож на мой, но не совсем так, потому что здесь мы кросс-кастинг базовых классов, а не производных