Должен static_cast <Полученный *> (Указатель базы) дают ошибку времени компиляции?

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?
}
13
задан MrSlippers 3 March 2011 в 15:43
поделиться

2 ответа

Он не может выдать ошибку времени компиляции, потому что связь Base-Derived может существовать во время выполнения в зависимости от адреса приводимых указателей. static_cast всегда выполняется успешно, но вызовет undefined-behavior , если вы не приведете к правильному типу. dynamic_cast может дать сбой или нет, фактически сообщая вам, пытались ли вы привести к правильному типу или нет.

Поэтому, на мой взгляд, static_cast следует использовать для понижающего преобразования , только если проект может установить, что такая возможность существует. Хорошим примером этого является CRTP . Так что в некоторых ситуациях это логично, но старайтесь избегать этого, поскольку это неопределенное поведение.

RTTI не требуется для static_cast , что может сделать его теоретически быстрее , но я в любой момент обменяю dynamic_cast на неопределенное поведение, которое ] static_cast может вызвать!

15
ответ дан 1 December 2019 в 20:56
поделиться

Это не дает ошибки времени компиляции, потому что приведение вполне может быть правильным, и вы часто делаете это на практике, например:

A* a = new B;
B* b = static_cast<B*>(a); // OK

В вашем коде, что касается компилятора, вы делаете то же самое. Он не может знать, что приведение будет недействительным, поэтому разрешает его во время компиляции. Однако во время выполнения вы столкнетесь с некоторыми неприятными ошибками, как только попытаетесь использовать функцию B на экземпляре A .

13
ответ дан 1 December 2019 в 20:56
поделиться
Другие вопросы по тегам:

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