static_cast (Указатель базы) должен дать ошибку времени компиляции?
class A
{
public:
A()
{
}
};
class B : public A
{
public:
B()
{
}
};
int main()
{
A *a=new A();
B * b=static_cast<B*>(a); // Compile Error?
}
Он не может выдать ошибку времени компиляции, потому что связь Base-Derived может существовать во время выполнения в зависимости от адреса приводимых указателей.
static_cast
всегда выполняется успешно, но вызовет undefined-behavior , если вы не приведете к правильному типу. dynamic_cast
может дать сбой или нет, фактически сообщая вам, пытались ли вы привести к правильному типу или нет.
Поэтому, на мой взгляд, static_cast
следует использовать для понижающего преобразования , только если проект может установить, что такая возможность существует. Хорошим примером этого является CRTP . Так что в некоторых ситуациях это логично, но старайтесь избегать этого, поскольку это неопределенное поведение.
RTTI не требуется для static_cast
, что может сделать его теоретически быстрее , но я в любой момент обменяю dynamic_cast
на неопределенное поведение, которое ] static_cast
может вызвать!
Это не дает ошибки времени компиляции, потому что приведение вполне может быть правильным, и вы часто делаете это на практике, например:
A* a = new B;
B* b = static_cast<B*>(a); // OK
В вашем коде, что касается компилятора, вы делаете то же самое. Он не может знать, что приведение будет недействительным, поэтому разрешает его во время компиляции. Однако во время выполнения вы столкнетесь с некоторыми неприятными ошибками, как только попытаетесь использовать функцию B
на экземпляре A
.