Чтобы избежать ситуации X Y, я пытаюсь проверить, допустимо ли приведение указателя void*
.
Чтобы решить эту проблему, я хотел использовать свойства dynamic_cast
.
Учитывая следующий код:
class A
{
virtual void foo(){}
};
class B
{
virtual void bar(){}
};
void* createA() { return new A();}
void* createB() { return new B();}
int main()
{
A* ptr =reinterpret_cast<A*>(createA());
A* ptr2 = reinterpret_cast<A*> (createB());
ptr = dynamic_cast<A*>(ptr); // not NULL as expected
ptr2 = dynamic_cast<A*> (ptr2); // was expecting NULL, however it's a valid pointer
}
Разве не предполагалось, что dynamic_cast потерпит неудачу с NULL, если RTTI не соответствует ожидаемому типу?
void*
в функции, которая может возвращать только один тип указателей, кажется немного странным - person Vivick   schedule 16.06.2017NULL
во втором случае? Как только вы использовалиreinterpret_cast<>
, вы переопределили любую потенциально существующую информацию о типе (которой в любом случае нет сvoid*
). - person πάντα ῥεῖ   schedule 16.06.2017void*
не имеет vtable или RTTI. - person πάντα ῥεῖ   schedule 16.06.2017void*
? - person πάντα ῥεῖ   schedule 16.06.2017