Upcasting указатели

У меня есть сомнения с апкастинг с указателями в C ++.

Я собираюсь написать пример моей проблемы:

class A {}
class B : public A {}

A* pA = new A();
B* pB = new B();

pA = pB; //fails
pA = dynamic_cast<A*>(pB); //fails

Я не знаю, что мне не хватает. Я думаю, что я вообще не понимаю, что такое апокалипсис. Любая помощь, пожалуйста? Спасибо

ОБНОВЛЕНО С ошибкой:

[exec] ..\asdf\qwerty.cpp(123) : error C2681: 'B*' : invalid expression type for dynamic_cast

Я нашел, как это работает, вот так:

pA* = (pA*)pB;

Но я не понимаю почему.

РЕДАКТИРОВАТЬ: Мой редактор говорит мне, что: «значение типа B * не может быть присвоено объекту типа A *». Что это значит?

Точнее, функция pB возвращается функцией. Я не знаю, есть ли что-то сделать, это как это:

class C {
B* pB;
B* getB() { return pB; }
}

A* pA;
pA = c.getB(); //this crashes. c was declared before... it is just an example

-2

Решение

Вам не хватает точек с запятой ; после определения класса:

class A {};
class B : public A {};

Также для dynamic_cast чтобы вернуть значимый результат, вам нужен по крайней мере один виртуальный метод в A. Вам нужен виртуальный деструктор в полиморфном базовом классе, чтобы уничтожение работало правильно в любом случае:

class A {
public:
virtual ~A() {}
};
1

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

нет причин для pA = pB; не работает, это должно работать, что вы подразумеваете под «не удается»?
Повышение указателя является тривиальным и может использоваться без динамического приведения.

1

Вам не хватает точек с запятой в определении классов. Обновление в C ++ абсолютно законно и может быть сделано неявным образом (полиморфизм). Это работает для меня:

class A {

public:
virtual ~A() {}
};

class B : public A {};

int     main()
{
A* pA;
B* pB = new B();

pA = pB;
delete pB;
return (0);
}

Кроме того, вы должны объявить деструктор A как virtual чтобы избежать возможных утечек памяти. Если вы этого не сделаете и попытаться удалить экземпляр BДеструктор A будет называться, но деструктор B не будет вызываться, оставляя все выделенные ресурсы, удерживаемые B unfreed.

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