У меня есть сомнения с апкастинг с указателями в 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
Вам не хватает точек с запятой ;
после определения класса:
class A {};
class B : public A {};
Также для dynamic_cast
чтобы вернуть значимый результат, вам нужен по крайней мере один виртуальный метод в A. Вам нужен виртуальный деструктор в полиморфном базовом классе, чтобы уничтожение работало правильно в любом случае:
class A {
public:
virtual ~A() {}
};
нет причин для pA = pB; не работает, это должно работать, что вы подразумеваете под «не удается»?
Повышение указателя является тривиальным и может использоваться без динамического приведения.
Вам не хватает точек с запятой в определении классов. Обновление в 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.