У меня есть следующий код:downcasting dynamic_cast с неполиморфными классами, почему он не компилируется?
using namespace std;
class BaseOk
{
public:
virtual void ImplementMe()
{
};
};
class DerivedOk : public BaseOk
{
public:
void ImplementMe()
{
}
};
class CBase { };
class CDerived: public CBase { };
int main()
{
CBase b; CBase* pb;
CDerived d; CDerived* pd;
pb = dynamic_cast<CBase*>(&d); // ok: derived-to-base
pd = dynamic_cast<CDerived*>(&b); // wrong: base-to-derived -> this doesn't compile
// Polymorphic case
BaseOk b2; BaseOk* pb2;
DerivedOk d2; DerivedOk* pd2;
pb2 = dynamic_cast<BaseOk*>(&d2); // ok: derived-to-base
pd2 = dynamic_cast<DerivedOk*>(&b2); // wrong: base-to-derived -> this returns a NULL pointer
}
Строка с указателем «э.р.» выполняет подавленным, и я согласен, что он должен терпеть неудачу, потому что результат совершенно другой объект. Мой вопрос: почему динамическая_сказка в этой строке вообще не компилируется вместо того, чтобы просто возвращать указатель NULL?
Я использую MSVC2012 компилятор
Сообщение об ошибке, которое вы получаете также –
dynamic_cat принимает информацию RTTI, и если у вас нет полиморфных типов, у вас нет RTTI (попробуйте dynamic_cast int to float, вы столкнетесь с тем же) –
Он компилируется для меня на gcc 4,7. – mfontanini