Проблема с перекрестным приведением в Visual Studio 2003 - PullRequest
0 голосов
/ 03 декабря 2009

Я использую Visual Studio 2003 для компиляции и запуска следующей программы.

Есть 4 операции присваивания, где я ожидаю, что 2 из них будут работать нормально, и 2 из них вызовут исключение. Внутри перегруженного = operator происходит динамическое приведение, которое ожидает сбой во время неправильного перекрестного преобразования (приведение от Apple до Orange или Orange до Apple). Но в моем случае все 4 операции не выполняются (исключение Raising). Я запустил тот же код в Visual Studio 2008, и он работает нормально, как ожидалось. Но переместить весь проект на Visual Studio 2008 сложно. Это проблема Visual Studio 2003? Если так, есть ли способ исправить это?

Примечание: класс Fruit доступен только для чтения и не может быть изменен.

class Fruit
{
public:
    virtual void operator = ( const Fruit& fruit )
    {
    }
};

class Apple : public Fruit
{
public:
    virtual void operator = ( const Fruit& fruit )
    {
        Apple& apple = dynamic_cast<Apple&>( fruit );
    }
};

class Mango : public Fruit
{
public:
    virtual void operator = ( const Fruit& fruit )
    {
        Mango& mango = dynamic_cast<Mango&>( fruit );
    }
};

int main( void )
{
    Apple apple;
    Mango mango;
    Fruit* fruit[] = { &apple, &mango };

    *fruit[0] = *fruit[0]; /* Expect to work ok */
    *fruit[0] = *fruit[1]; /* Expect an exception */
    *fruit[1] = *fruit[0]; /* Expect an exception */
    *fruit[1] = *fruit[1]; /* Expect to work ok */
}

1 Ответ

2 голосов
/ 03 декабря 2009

Вам необходимо проверить Enable Run-time type information (RTTI) в настройках проекта. Категория "C ++ Language".

В VC6 по крайней мере он не будет включен по умолчанию.

...