У меня есть сомнения по поводу понижения объекта в C ++.
Вот пример:
class A { }
class B : public A {
public:
void SetVal(int i) { _v = i; }
private:
int _v;
}
A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
Что бы это случилось с этим примером? Мы модифицируем базовое предложение, как если бы оно было дочерним … как оно работает с памятью?
С этим приведением … Это похоже на создание экземпляра B и копирование значений A?
Спасибо
A* a;
Это просто дает вам указатель на A
, Это нигде не указывает конкретно. Это не указывает на A
или же B
объект вообще. Работает ли ваш код или нет, зависит от динамического типа объекта, на который он указывает.
Итак, есть две ситуации, о которых вы, возможно, захотите узнать. Во-первых, этот:
A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
Это даст вам неопределенное поведение, потому что dynamic_cast
вернет нулевой указатель. Возвращает нулевой указатель, когда динамический тип объекта на самом деле не B
, В этом случае объект является A
, Затем вы пытаетесь разыменовать нулевой указатель с помощью b->SetVal(2)
, так что вы получите неопределенное поведение.
A* a = new B();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
Это будет хорошо работать, потому что объект действительно B
объект. Динамический бросок будет успешным, а SetVal
звонок будет работать просто отлично.
Тем не менее, обратите внимание, что для этого, A
должен быть полиморфным типом. Чтобы это было правдой, он должен иметь хотя бы одну виртуальную функцию-член.
Это даже не должно компилироваться, потому что классы не полиморфны, поэтому вы не можете использовать dynamic_cast
,
Если бы это было так, это было бы неопределенным поведением.