наследование — снижение класса переполнения стека

У меня есть сомнения по поводу понижения объекта в 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?

Спасибо

2

Решение

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 должен быть полиморфным типом. Чтобы это было правдой, он должен иметь хотя бы одну виртуальную функцию-член.

6

Другие решения

Это даже не должно компилироваться, потому что классы не полиморфны, поэтому вы не можете использовать dynamic_cast,

Если бы это было так, это было бы неопределенным поведением.

1

По вопросам рекламы [email protected]